예제 #1
0
        private ArrayType GetArrayType(PapyrusType elementType)
        {
            var objectIdentifier = elementType.Name;

            lock (_arrayTypes)
            {
                if (!_arrayTypes.ContainsKey(objectIdentifier))
                {
                    var source = CreateArrayTypeSource(objectIdentifier);
                    var stream = new CaseInsensitiveStringStream(source);
                    var lexer  = new PapyrusLexer(stream);
                    var parser = new PapyrusParser(new CommonTokenStream(lexer));
                    parser.AsDynamic().KnownUserFlags = _program.FlagsFile.NativeFlagsDict;
                    parser.script();

                    var compilerType = parser.ParsedObject;

                    var nodeBinder = new NodeBinder();

                    var node = nodeBinder.Bind(null, _program,
                                               new ScriptText(null, source, "0"), compilerType.GetTokenStream(), compilerType.GetAst());

                    var scopeBinder = new ScopeBinder();
                    var scopeResult = scopeBinder.Bind(compilerType, node.Value);

                    node.Diagnostics.AddRange(scopeResult.Diagnostics);

                    var symbolBinder = new SymbolBinder();
                    var symbolResult = symbolBinder.Bind(node.Value);

                    var type = new ArrayType(_program, symbolResult.Value, compilerType, elementType.Name);
                    _arrayTypes.Add(objectIdentifier, type);
                }

                return(_arrayTypes[objectIdentifier]);
            }
        }
예제 #2
0
 public static void OnError(this PapyrusLexer lexer, Action <object, ErrorEventArgs> handler)
 {
     OnError(lexer, _errorHandlerName, handler);
 }