コード例 #1
0
 public SymbolResolverVisitor(SymbolTable symtable, TypeInferrer inferrer)
 {
     this.SymbolTable                  = symtable;
     this.Inferrer                     = inferrer;
     this.unarySymbolResolver          = new UnarySymbolResolver();
     this.binarySymbolResolver         = new BinarySymbolResolver();
     this.assignmentSymbolResolver     = new AssignmentSymbolResolver();
     this.constantSymbolResolver       = new ConstantSymbolResolver();
     this.variableSymbolResolver       = new VariableSymbolResolver();
     this.blockSymbolResolver          = new BlockSymbolResolver();
     this.declarationSymbolResolver    = new DeclarationSymbolResolver();
     this.primitiveSymbolResolver      = new PrimitiveSymbolResolver();
     this.accessorSymbolResolver       = new AccessorSymbolResolver();
     this.ifSymbolResolver             = new IfSymbolResolver();
     this.whileSymbolResolver          = new WhileSymbolResolver();
     this.forSymbolResolver            = new ForSymbolResolver();
     this.breakSymbolResolver          = new BreakSymbolResolver();
     this.continueSymbolResolver       = new ContinueSymbolResolver();
     this.callSymbolResolver           = new CallableSymbolResolver();
     this.funcDeclSymbolResolver       = new FunctionSymbolResolver();
     this.objectSymbolResolver         = new ObjectSymbolResolver();
     this.objectPropertySymbolResolver = new ObjectPropertySymbolResolver();
     this.tupleSymbolResolver          = new TupleSymbolResolver();
     this.returnSymbolResolver         = new ReturnSymbolResolver();
     this.nullCoalescingSymbolResolver = new NullCoalescingSymbolResolver();
     this.classSymbolResolver          = new ClassSymbolResolver();
     this.classPropertySymbolResolver  = new ClassPropertySymbolResolver();
     this.classConstantSymbolResolver  = new ClassConstantSymbolResolver();
     this.classMethodSymbolResolver    = new ClassMethodSymbolResolver();
 }
コード例 #2
0
        private bool IsValidExtensionType(IType actualType, IType extensionType, IExtensionEnabled extension)
        {
            if (TypeCompatibilityRules.IsAssignableFrom(extensionType, actualType))
            {
                return(true);
            }

            // Check for a valid generic extension
            IMethod method = extension as IMethod;

            if (method == null || method.GenericInfo == null)
            {
                return(false);
            }

            System.Collections.Generic.List <IGenericParameter> genericParameters = new System.Collections.Generic.List <IGenericParameter>(GenericsServices.FindGenericParameters(extensionType));
            if (genericParameters.Count == 0)
            {
                return(false);
            }

            TypeInferrer inferrer = new TypeInferrer(genericParameters);

            inferrer.Infer(extensionType, actualType);
            return(inferrer.FinalizeInference());
        }
コード例 #3
0
        private Boolean TryGetElementStyle(IVisualElement element,
                                           String styleName,
                                           out IStyle style)
        {
            var styleType = TypeInferrer.GetTypeFromClearName(styleName);

            if (styleType == null)
            {
                style = default !;
コード例 #4
0
        BestType DetermineBestTypes(params object[] values)
        {
            var bestTypes = TypeInferrer.DetermineBestTypes(Data(values));

            return(bestTypes[_key]);
        }
コード例 #5
0
        public IFileConfig UpdateFileConfig(FileInfo file, IFileConfig prevConfig)
        {
            var csvConfig = prevConfig as CsvConfig ?? new CsvConfig
            {
                Delimiter = GetDefaultDelimiter(),
            };

            csvConfig.BestTypes = GetBestTypes();

            return csvConfig;

            Dictionary<string, BestType> GetBestTypes()
            {
                using var fileReader = file.OpenText();
                using var reader = GetTextReader(fileReader);

                var record = new List<string>();
                var q = from rec in reader.ReadCsvWithHeader(
                            delimiter: csvConfig.Delimiter,
                            textQualifier: csvConfig.TextQualifier,
                            record: record)
                        select
                            from k in rec.Keys
                            let value = rec.ContainsKey(k) ? rec[k] : string.Empty
                            select (k, value);

                return TypeInferrer.DetermineBestTypes(q, new TypeInferrer.Options { UserParser = CreateUserParser() });

                TypeInferrer.TryParseValue CreateUserParser()
                {
                    var trueSet = csvConfig.TrueStrings?.GetHashSet();
                    var falseSet = csvConfig.FalseStrings?.GetHashSet();
                    var nullSet = csvConfig.NullStrings?.GetHashSet();

                    return (string v, out ParsedValue x) =>
                    {
                        if (trueSet?.Contains(v) == true || falseSet?.Contains(v) == true)
                        {
                            x = ParsedValue.Bool;
                            return true;
                        }

                        if (nullSet?.Contains(v) == true)
                        {
                            x = ParsedValue.EmptyString;
                            return true;
                        }

                        x = default;
                        return false;
                    };
                }
            }

            TextReader GetTextReader(StreamReader fileReader)
            {
                if (string.IsNullOrWhiteSpace(csvConfig.Header))
                    return fileReader;

                return new CompositeTextReader(new TextReader[]
                {
                    new StringReader(csvConfig.Header.Trim() + Environment.NewLine),
                    fileReader
                });
            }

            char GetDefaultDelimiter() => file.Extension.ToLowerInvariant() switch
            {
                ".tsv" => '\t',
                _ => ','
            };
        }
コード例 #6
0
ファイル: SymbolTable.cs プロジェクト: lbrugnara/zenitsharp
 public SymbolTable(TypeInferrer typeInferrer)
 {
     // Create the @global scope and set it as the current scope
     this.Global       = this.CurrentScope = new Block("@global");
     this.TypeInferrer = typeInferrer;
 }
コード例 #7
0
ファイル: SymbolHelper.cs プロジェクト: lbrugnara/zenitsharp
        internal static IType GetTypeSymbol(SymbolTable symtable, TypeInferrer inferrer, Token token)
        {
            // If the token has a reference to an identifier, the types come from the explicit annotation
            if (token.Type == TokenType.Identifier)
            {
                if (token.Value == BuiltinType.Bool.GetName())
                {
                    return(new Primitive(BuiltinType.Bool, symtable.CurrentScope));
                }

                if (token.Value == BuiltinType.Char.GetName())
                {
                    return(new Primitive(BuiltinType.Char, symtable.CurrentScope));
                }

                if (token.Value == BuiltinType.Int.GetName())
                {
                    return(new Primitive(BuiltinType.Int, symtable.CurrentScope));
                }

                if (token.Value == BuiltinType.Float.GetName())
                {
                    return(new Primitive(BuiltinType.Float, symtable.CurrentScope));
                }

                if (token.Value == BuiltinType.Double.GetName())
                {
                    return(new Primitive(BuiltinType.Double, symtable.CurrentScope));
                }

                if (token.Value == BuiltinType.Decimal.GetName())
                {
                    return(new Primitive(BuiltinType.Decimal, symtable.CurrentScope));
                }

                if (token.Value == BuiltinType.String.GetName())
                {
                    return(new Primitive(BuiltinType.String, symtable.CurrentScope));
                }

                // Support complex types:
                if (token.Value == "func" || token.Value == "tuple")
                {
                    return(inferrer?.NewAnonymousType());
                }

                if (symtable.HasVariableSymbol(token.Value))
                {
                    /*var typeInfo = symtable.Get(token.Value).ITypeSymbol;
                     * if (typeInfo.Type is Class ctype)
                     *  return new ITypeSymbol(new ClassInstance(ctype));
                     * return typeInfo;*/
                }

                /*var type = new ClassInstance(new Class(token.Value));
                 * symtable.AddUnresolvedType(type.Class.ClassName, token);
                 * return new ITypeSymbol(type);*/
                throw new Exception($"Unknown type '{token.Value}'");
            }


            // Getting the type from a literal value or an 'auto' property
            switch (token.Type)
            {
            case TokenType.Boolean:
                return(new Primitive(BuiltinType.Bool, symtable.CurrentScope));

            case TokenType.Char:
                return(new Primitive(BuiltinType.Char, symtable.CurrentScope));

            case TokenType.Integer:
                return(new Primitive(BuiltinType.Int, symtable.CurrentScope));

            case TokenType.Float:
                return(new Primitive(BuiltinType.Float, symtable.CurrentScope));

            case TokenType.Double:
                return(new Primitive(BuiltinType.Double, symtable.CurrentScope));

            case TokenType.Decimal:
                return(new Primitive(BuiltinType.Decimal, symtable.CurrentScope));

            case TokenType.String:
                return(new Primitive(BuiltinType.String, symtable.CurrentScope));

            case TokenType.Variable:
                return(new None());
                //return inferrer?.NewAnonymousType(); // Auto
            }

            throw new SymbolException($"Unrecognized literal {token.Type}");
        }
コード例 #8
0
ファイル: SymbolHelper.cs プロジェクト: lbrugnara/zenitsharp
 internal static BuiltinType GetType(SymbolTable symtable, TypeInferrer inferrer, Token token)
 {
     return(GetTypeSymbol(symtable, inferrer, token).BuiltinType);
 }