private AnnotatedStatement AnnotateForStatement(ForStatementSyntax statement) { _scope = new AnnotationScope(_scope); var lowerBound = AnnotateExpression(statement.LowerBound, typeof(int)); var upperBound = AnnotateExpression(statement.UpperBound, typeof(int)); var name = statement.Identifier.Text; var variable = new VariableSymbol(name, typeof(int), false); _scope.TryDeclare(variable); var body = AnnotateStatement(statement.Body); _scope = _scope.Parent; return(new AnnotatedForStatement(variable, lowerBound, upperBound, body)); }
public AnnotatedStatement AnnotateVariableDeclaration(VariableDeclarationSyntax statement) { var expression = AnnotateExpression(statement.Initializer); var name = statement.Identifier.Text; var variable = new VariableSymbol(name, expression.Type, statement.IsReadOnly); if (statement.DatatypeKeyword.Kind == SyntaxKind.KeywordToken || name == null) { return(new AnnotateVariableDeclaration(variable, expression)); } if (statement.DatatypeKeyword.Type != expression.Type) { _diagnostics.ReportInvalidRightValue(statement.Identifier.Span, name, statement.DatatypeKeyword.Type, expression.Type); return(new AnnotateVariableDeclaration(variable, expression)); } if (!_scope.TryDeclare(variable)) { _diagnostics.ReportVariableAlreadyDeclared(statement.Identifier.Span, name); } return(new AnnotateVariableDeclaration(variable, expression)); }
private static AnnotationScope CreateParentScope(AnnotationGlobalScope previous) { var stack = new Stack <AnnotationGlobalScope>(); while (previous != null) { stack.Push(previous); previous = previous.Previous; } AnnotationScope parent = null; while (stack.Count > 0) { previous = stack.Pop(); var scope = new AnnotationScope(parent); foreach (var v in previous.Symbols) { scope.TryDeclare(v); } parent = scope; } return(parent); }