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);
        }
Exemple #2
0
        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));
Exemple #4
0
        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);
            }
        }