public void use_type_defined_below() { var typeA = new AliasTypeDeclarationNode { ExistingType = new TypeReferenceNode { TypeName = "b" }, Name = new TypeIdentifierNode { Name = "a" } }; var typeB = new AliasTypeDeclarationNode { ExistingType = new TypeReferenceNode { TypeName = "int" }, Name = new TypeIdentifierNode { Name = "b" } }; var types = new[] { typeA, typeB }; var target = new CircularTypeReferencesError(types, SourceLocation.Invalid); CollectionAssert.AreEqual(new[] { typeB, typeA }, target.OrderedTypes); Assert.IsFalse(target.IsActive); }
protected internal override void CheckSemantics(AstHelper astHelper) { AstHelper helper = astHelper.CreateChild(function: true, variables: true, types: true); // add all type builders to the scope in case of recursive type calls foreach (IAddToScope typeDeclarationNode in TypeDeclarations.OfType <IAddToScope>()) { typeDeclarationNode.AddToScope(helper); } var error = new CircularTypeReferencesError(TypeDeclarations, Start); astHelper.Errors.Check(error); // define other types foreach (TypeDeclarationNode typeDeclarationNode in error.OrderedTypes) { typeDeclarationNode.CheckSemantics(helper); } // add all functions to the scope in case of recursive calls foreach (FunctionDefinitionExpression functionDefinitionExpression in FunctionDefinitions) { functionDefinitionExpression.AddToScope(helper); } foreach (VariableDeclarationBase variableDeclarationExpression in VariableDeclarations) { variableDeclarationExpression.CheckSemantics(helper); } foreach (FunctionDefinitionExpression functionDefinitionExpression in FunctionDefinitions) { functionDefinitionExpression.CheckSemantics(helper); } Body.CheckSemantics(helper); IEnumerable <ParameterExpression> variables = from variable in VariableDeclarations select variable.Pointer; IEnumerable <ParameterExpression> functions = from function in FunctionDefinitions select function.Pointer; // calculate the closure that will be used when we're generating the expression _closure = variables.Union(functions); }
public void returns_types_not_involved_in_cicle() { var typeA = new AliasTypeDeclarationNode { ExistingType = new TypeReferenceNode { TypeName = "b" }, Name = new TypeIdentifierNode { Name = "a" } }; var typeB = new AliasTypeDeclarationNode { ExistingType = new TypeReferenceNode { TypeName = "a" }, Name = new TypeIdentifierNode { Name = "b" } }; var typeC = new AliasTypeDeclarationNode { ExistingType = new TypeReferenceNode { TypeName = "int" }, Name = new TypeIdentifierNode { Name = "c" } }; var types = new[] { typeA, typeB, typeC }; var target = new CircularTypeReferencesError(types, SourceLocation.Invalid); CollectionAssert.AreEqual(new[] { typeC }, target.OrderedTypes); Assert.IsTrue(target.IsActive); }
public void detect_cicle_with_three_types() { var typeA = new AliasTypeDeclarationNode { ExistingType = new TypeReferenceNode { TypeName = "b" }, Name = new TypeIdentifierNode { Name = "a" } }; var typeB = new AliasTypeDeclarationNode { ExistingType = new TypeReferenceNode { TypeName = "c" }, Name = new TypeIdentifierNode { Name = "b" } }; var typeC = new AliasTypeDeclarationNode { ExistingType = new TypeReferenceNode { TypeName = "a" }, Name = new TypeIdentifierNode { Name = "c" } }; var types = new[] { typeA, typeB, typeC }; var target = new CircularTypeReferencesError(types, SourceLocation.Invalid); Assert.IsTrue(target.IsActive); }