private void BuildType(TypeSymbol typeSymbol, UserTypeNode typeNode) { Debug.Assert(typeSymbol != null); Debug.Assert(typeNode != null); ParseNodeList attributes = typeNode.Attributes; if (AttributeNode.FindAttribute(attributes, "Imported") != null) { typeSymbol.SetImported(/* dependencyName */ null); } if (AttributeNode.FindAttribute(attributes, "IgnoreNamespace") != null) { typeSymbol.SetIgnoreNamespace(); } if (AttributeNode.FindAttribute(attributes, "PreserveName") != null) { typeSymbol.DisableNameTransformation(); } string scriptName = GetAttributeValue(attributes, "ScriptName"); if (scriptName != null) { typeSymbol.SetTransformedName(scriptName); } if (typeNode.Type == TokenType.Class) { bool globalizeMembers = false; string mixinRoot = null; AttributeNode globalMethodsAttribute = AttributeNode.FindAttribute(attributes, "GlobalMethods"); if (globalMethodsAttribute != null) { globalizeMembers = true; } else { AttributeNode mixinAttribute = AttributeNode.FindAttribute(attributes, "Mixin"); if (mixinAttribute != null) { Debug.Assert(mixinAttribute.Arguments[0] is LiteralNode); Debug.Assert(((LiteralNode)mixinAttribute.Arguments[0]).Value is string); mixinRoot = (string)((LiteralNode)mixinAttribute.Arguments[0]).Value; globalizeMembers = true; } } if (globalizeMembers) { ((ClassSymbol)typeSymbol).SetGlobalMethods(mixinRoot); } } if (typeNode.Type == TokenType.Enum) { if (AttributeNode.FindAttribute(attributes, "NamedValues") != null) { ((EnumerationSymbol)typeSymbol).SetNamedValues(); } else if (AttributeNode.FindAttribute(attributes, "NumericValues") != null) { ((EnumerationSymbol)typeSymbol).SetNumericValues(); } } }
private TypeSymbol BuildType(UserTypeNode typeNode, NamespaceSymbol namespaceSymbol) { Debug.Assert(typeNode != null); Debug.Assert(namespaceSymbol != null); TypeSymbol typeSymbol = null; ParseNodeList attributes = typeNode.Attributes; if (typeNode.Type == TokenType.Class) { CustomTypeNode customTypeNode = (CustomTypeNode)typeNode; Debug.Assert(customTypeNode != null); NameNode baseTypeNameNode = null; if (customTypeNode.BaseTypes.Count != 0) { baseTypeNameNode = customTypeNode.BaseTypes[0] as NameNode; } if ((baseTypeNameNode != null) && (String.CompareOrdinal(baseTypeNameNode.Name, "Record") == 0)) { typeSymbol = new RecordSymbol(typeNode.Name, namespaceSymbol); } else { AttributeNode resourcesAttribute = AttributeNode.FindAttribute(attributes, "Resources"); if (resourcesAttribute != null) { typeSymbol = new ResourcesSymbol(typeNode.Name, namespaceSymbol); } else { typeSymbol = new ClassSymbol(typeNode.Name, namespaceSymbol); if ((baseTypeNameNode != null) && (String.CompareOrdinal(baseTypeNameNode.Name, "TestClass") == 0)) { ((ClassSymbol)typeSymbol).SetTestClass(); } } } } else if (typeNode.Type == TokenType.Interface) { typeSymbol = new InterfaceSymbol(typeNode.Name, namespaceSymbol); } else if (typeNode.Type == TokenType.Enum) { bool flags = false; AttributeNode flagsAttribute = AttributeNode.FindAttribute(typeNode.Attributes, "Flags"); if (flagsAttribute != null) { flags = true; } typeSymbol = new EnumerationSymbol(typeNode.Name, namespaceSymbol, flags); } else if (typeNode.Type == TokenType.Delegate) { typeSymbol = new DelegateSymbol(typeNode.Name, namespaceSymbol); typeSymbol.SetTransformedName("Function"); typeSymbol.SetIgnoreNamespace(); } Debug.Assert(typeSymbol != null, "Unexpected type node " + typeNode.Type); if (typeSymbol != null) { if ((typeNode.Modifiers & Modifiers.Public) != 0) { typeSymbol.SetPublic(); } BuildType(typeSymbol, typeNode); if (namespaceSymbol.Name.EndsWith(_options.TestsSubnamespace, StringComparison.Ordinal)) { typeSymbol.SetTestType(); } } return typeSymbol; }