public DogeSymbolTable AddClassSymbolTable(DogeClassDefinition @class, IList <string> fullName) { SetClassSymbol(@class, fullName); fullName = fullName.With(@class.Name); var internalSymbolTable = GetOrAddSymbolTable(@class.Name, DogeSymbolTableType.Type); foreach (var field in @class.FieldDefinitions) { internalSymbolTable.SetFieldSymbol(field, fullName); } foreach (var property in @class.PropertyDefinitions) { internalSymbolTable.SetPropertySymbol(property, fullName); } foreach (var method in @class.MethodDefinitions) { internalSymbolTable.SetMethodSymbol(method, fullName); } return(internalSymbolTable); }
private void ResolveSymbolTypes(DogeClassDefinition @class, DogeSymbolTable symbolTable, ICollection <IList <string> > usingDefinitions, IList <string> fullName) { foreach (var field in @class.FieldDefinitions) { var symbol = symbolTable.GetSymbolTable(fullName).GetSymbol(field.Name); symbol.TypeSymbol = symbolTable.ResolveSymbol( symbol.Type !, s => s.SymbolType == DogeSymbolType.Type, s => s == DogeSymbolTableType.Namespace || s == DogeSymbolTableType.Type, usingDefinitions); } foreach (var property in @class.PropertyDefinitions) { var symbol = symbolTable.GetSymbolTable(fullName).GetSymbol(property.Name); symbol.TypeSymbol = symbolTable.ResolveSymbol( symbol.Type !, s => s.SymbolType == DogeSymbolType.Type, s => s == DogeSymbolTableType.Namespace || s == DogeSymbolTableType.Type, usingDefinitions); } foreach (var method in @class.MethodDefinitions) { var symbol = symbolTable.GetSymbolTable(fullName).GetSymbol(method.Name); if (symbol.Type == null) { continue; } symbol.TypeSymbol = symbolTable.ResolveSymbol( symbol.Type !, s => s.SymbolType == DogeSymbolType.Type, s => s == DogeSymbolTableType.Namespace || s == DogeSymbolTableType.Type, usingDefinitions); method.Method.ReturnTypeSymbol = new DogeSymbolNode(symbolTable.ResolveSymbol( method.Method.ReturnType, s => s.SymbolType == DogeSymbolType.Type, s => s == DogeSymbolTableType.Namespace || s == DogeSymbolTableType.Type, usingDefinitions), method.Method.ReturnTypeIdentifier.File, method.Method.ReturnTypeIdentifier.TokenRange); foreach (var parameter in method.Method.Parameters) { parameter.TypeSymbol = new DogeSymbolNode(symbolTable.ResolveSymbol( parameter.Type, s => s.SymbolType == DogeSymbolType.Type, s => s == DogeSymbolTableType.Namespace || s == DogeSymbolTableType.Type, usingDefinitions), parameter.TypeIdentifier.File, parameter.TypeIdentifier.TokenRange); } } }
private DogeSymbol SetClassSymbol(DogeClassDefinition @class, IList <string> fullName) => SetSymbol(@class.Name, new DogeSymbol( @class.Name, fullName.With(@class.Name), DogeSymbolAttribute.None, DogeSymbolType.Type, @class.Modifier, null, @class));
private void ResolveSymbols(DogeClassDefinition @class, DogeSymbolTable symbolTable, ICollection <IList <string> > usingDefinitions, IList <string> fullName) { foreach (var property in @class.PropertyDefinitions) { if (property.Get != null) { ResolveSymbols( property.Get.MethodBody, symbolTable, new Dictionary <string, DogeLocalDeclarationStatement>(), usingDefinitions, fullName); } if (property.Set != null) { ResolveSymbols( property.Set.MethodBody, symbolTable, new Dictionary <string, DogeLocalDeclarationStatement>(), usingDefinitions, fullName); } } foreach (var method in @class.MethodDefinitions) { ResolveSymbols( method.Method.MethodBody, symbolTable, new Dictionary <string, DogeLocalDeclarationStatement>(), usingDefinitions, fullName); } }