Merged sunConstDefinition and sunVariableDefinition

Now sunVariableDefinition declares either a constant symbol or a
variable symbol, depending on the appearance of the 'const' modifier.
This commit is contained in:
arookas 2016-02-22 20:53:40 -05:00
parent d7ce89ca9a
commit a676f9e8e5
2 changed files with 19 additions and 27 deletions

View file

@ -53,9 +53,24 @@
: base(location) { } : base(location) { }
public override void Compile(sunCompiler compiler) { public override void Compile(sunCompiler compiler) {
var symbol = compiler.Context.DeclareVariable(this); // create the right type of symbol based on the const modifier
symbol.Modifiers = Modifiers; var isConst = (Modifiers & sunSymbolModifiers.Constant) != 0;
Operator.Compile(compiler, symbol, Expression); if (isConst) {
// analyze the expression. this does two things:
// 1) prevents recursion (i.e. the const referencing itself)
// 2) asserts actual constness
var flags = Expression.Analyze(compiler.Context);
if (flags.HasFlag(sunExpressionFlags.Dynamic)) {
throw new sunConstantExpressionException(Expression);
}
var symbol = compiler.Context.DeclareConstant(this);
symbol.Modifiers = Modifiers;
}
else {
var symbol = compiler.Context.DeclareVariable(this);
symbol.Modifiers = Modifiers;
Operator.Compile(compiler, symbol, Expression);
}
} }
} }
@ -75,27 +90,4 @@
Operator.Compile(compiler, symbol, Expression); Operator.Compile(compiler, symbol, Expression);
} }
} }
class sunConstantDefinition : sunNode {
public sunIdentifier Name { get { return this[1] as sunIdentifier; } }
public sunExpression Expression { get { return this[3] as sunExpression; } }
public sunSymbolModifiers Modifiers {
get { return sunSymbol.GetModifiers(this[0]) | sunSymbolModifiers.Constant; }
}
public sunConstantDefinition(sunSourceLocation location)
: base(location) { }
public override void Compile(sunCompiler compiler) {
// analyze the expression. this does two things:
// 1) prevents recursion (i.e. the const referencing itself)
// 2) asserts actual constness
var flags = Expression.Analyze(compiler.Context);
if (flags.HasFlag(sunExpressionFlags.Dynamic)) {
throw new sunConstantExpressionException(Expression);
}
compiler.Context.DeclareConstant(this);
}
}
} }

View file

@ -111,7 +111,7 @@ namespace arookas {
} }
return symbol; return symbol;
} }
public sunConstantSymbol DeclareConstant(sunConstantDefinition node) { public sunConstantSymbol DeclareConstant(sunVariableDefinition node) {
return DeclareConstant(node.Name, node.Expression, node.Modifiers); return DeclareConstant(node.Name, node.Expression, node.Modifiers);
} }
sunConstantSymbol DeclareConstant(sunIdentifier node, sunExpression expression, sunSymbolModifiers modifiers) { sunConstantSymbol DeclareConstant(sunIdentifier node, sunExpression expression, sunSymbolModifiers modifiers) {