Example #1
0
        public TypeReader <Type> GetReader()
        {
            TypeReader <Type>   typeReader   = _typeSerializer.GetReader();
            TypeReader <string> stringReader = _stringSerializer.GetReader();

            return(value =>
            {
                string typeString = stringReader(value);

                Type typeValue = typeReader(typeString);

                return typeValue;
            });
        }
Example #2
0
        internal ParameterInfo(ParameterBuilder builder, CommandInfo command, CommandService service)
        {
            Command = command;

            Name        = builder.Name;
            Summary     = builder.Summary;
            IsOptional  = builder.IsOptional;
            IsRemainder = builder.IsRemainder;
            IsMultiple  = builder.IsMultiple;

            Type         = builder.ParameterType;
            DefaultValue = builder.DefaultValue;

            Preconditions = builder.Preconditions.ToImmutableArray();
            Attributes    = builder.Attributes.ToImmutableArray();

            _reader = builder.TypeReader;
        }
        internal static TypeReader GetTypeReader(CommandService service, Type paramType, Type typeReaderType, IServiceProvider services)
        {
            var        readers = service.GetTypeReaders(paramType);
            TypeReader reader  = null;

            if (readers != null)
            {
                if (readers.TryGetValue(typeReaderType, out reader))
                {
                    return(reader);
                }
            }

            //We dont have a cached type reader, create one
            reader = ReflectionUtils.CreateObject <TypeReader>(typeReaderType.GetTypeInfo(), service, services);
            service.AddTypeReader(paramType, reader, false);

            return(reader);
        }
        private TypeReader GetReader(Type type)
        {
            CommandService commands = Command.Module.Service;

            if (type.GetTypeInfo().GetCustomAttribute <NamedArgumentTypeAttribute>() != null)
            {
                IsRemainder = true;
                TypeReader reader = commands.GetTypeReaders(type)?.FirstOrDefault().Value;
                if (reader == null)
                {
                    Type readerType;
                    try
                    {
                        readerType = typeof(NamedArgumentTypeReader <>).MakeGenericType(new[] { type });
                    }
                    catch (ArgumentException ex)
                    {
                        throw new InvalidOperationException($"Parameter type '{type.Name}' for command '{Command.Name}' must be a class with a public parameterless constructor to use as a NamedArgumentType.", ex);
                    }

                    reader = (TypeReader)Activator.CreateInstance(readerType, new[] { commands });
                    commands.AddTypeReader(type, reader);
                }

                return(reader);
            }


            IDictionary <Type, TypeReader> readers = commands.GetTypeReaders(type);

            if (readers != null)
            {
                return(readers.FirstOrDefault().Value);
            }
            else
            {
                return(commands.GetDefaultTypeReader(type));
            }
        }
Example #5
0
        /// <summary>
        ///     Adds a custom <see cref="TypeReader" /> to this <see cref="CommandService" /> for the supplied object
        ///     type.
        ///     If <paramref name="type" /> is a <see cref="ValueType" />, a nullable <see cref="TypeReader" /> for the
        ///     value type will also be added.
        /// </summary>
        /// <param name="type">A <see cref="Type" /> instance for the type to be read.</param>
        /// <param name="reader">An instance of the <see cref="TypeReader" /> to be added.</param>
        /// <param name="replaceDefault">
        ///     Defines whether the <see cref="TypeReader" /> should replace the default one for <see cref="Type" /> if
        ///     it exists.
        /// </param>
        public void AddTypeReader(Type type, TypeReader reader, bool replaceDefault)
        {
            if (replaceDefault && HasDefaultTypeReader(type))
            {
                _defaultTypeReaders.AddOrUpdate(type, reader, (k, v) => reader);

                if (type.GetTypeInfo().IsValueType)
                {
                    var nullableType   = typeof(Nullable <>).MakeGenericType(type);
                    var nullableReader = NullableTypeReader.Create(type, reader);
                    _defaultTypeReaders.AddOrUpdate(nullableType, nullableReader, (k, v) => nullableReader);
                }
            }
            else
            {
                var readers = _typeReaders.GetOrAdd(type, x => new ConcurrentDictionary <Type, TypeReader>());
                readers[reader.GetType()] = reader;

                if (type.GetTypeInfo().IsValueType)
                {
                    AddNullableTypeReader(type, reader);
                }
            }
        }
Example #6
0
 public NullableSerializer(TypeSerializer <T> serializer)
 {
     _serializer = serializer;
     _reader     = _serializer.GetReader();
     _writer     = _serializer.GetWriter();
 }
Example #7
0
        //private int trydepth;
        public void buildAS3Try(CompileEnv env, ASTool.AS3.AS3Try as3try, Builder builder)
        {
            //***先编译Try块
            //trydepth++;
            int tryid = as3try.holdTryId;

            //string LBL_BEGIN_TRY = "BEGIN_TRY_" + tryid;
            //string LBL_END_TRY = "END_TRY_" + tryid;
            string LBL_BEGIN_FINALLY = "BEGIN_FINALLY_" + tryid;
            string LBL_END_FINALLY   = "END_FINALLY_" + tryid;

            string LBL_CATCH = "BEGIN_CATCH_" + tryid;

            //OpStep begintry = new OpStep(OpCode.flag, new SourceToken(as3try.Token.line, as3try.Token.ptr, as3try.Token.sourceFile));
            //begintry.flag = LBL_BEGIN_TRY;
            //env.block.opSteps.Add(begintry);

            //**包装一个block**
            ASTool.AS3.AS3Block tempblock = new ASTool.AS3.AS3Block(as3try.Token);
            tempblock.CodeList = as3try.TryBlock;
            tempblock.label    = as3try.label;

            {
                OpStep enter_try = new OpStep(OpCode.enter_try, new SourceToken(as3try.Token.line, as3try.Token.ptr, as3try.Token.sourceFile));
                enter_try.arg1     = new ASBinCode.rtData.RightValue(new ASBinCode.rtData.rtInt(tryid));
                enter_try.arg1Type = RunTimeDataType.rt_int;
                env.block.opSteps.Add(enter_try);
            }


            builder.buildStmt(env, tempblock);

            {
                OpStep quit_try = new OpStep(OpCode.quit_try, new SourceToken(as3try.Token.line, as3try.Token.ptr, as3try.Token.sourceFile));
                quit_try.arg1     = new ASBinCode.rtData.RightValue(new ASBinCode.rtData.rtInt(tryid));
                quit_try.arg1Type = RunTimeDataType.rt_int;
                env.block.opSteps.Add(quit_try);
            }

            //OpStep endtry= new OpStep(OpCode.flag, new SourceToken(as3try.Token.line, as3try.Token.ptr, as3try.Token.sourceFile));
            //endtry.flag = LBL_END_TRY;
            //env.block.opSteps.Add(endtry);

            //***跳转到Finally块***
            {
                jumpTo(env, as3try, builder, LBL_BEGIN_FINALLY);
            }

            OpStep startCatch = new OpStep(OpCode.flag, new SourceToken(as3try.Token.line, as3try.Token.ptr, as3try.Token.sourceFile));

            startCatch.flag = LBL_CATCH;
            env.block.opSteps.Add(startCatch);



            //***编译Catch块***
            for (int i = 0; i < as3try.CatchList.Count; i++)
            {
                var c = as3try.CatchList[i];
                //c.CatchVariable.Name = "0"+c.CatchVariable.Name + "_" + i;


                VariableBase rtVariable = new Variable(c.CatchVariable.Name, env.block.scope.members.Count, true, env.block.id);
                rtVariable.valueType = TypeReader.fromSourceCodeStr(c.CatchVariable.TypeStr, c.CatchVariable.token, builder);
                env.block.scope.members.Add(rtVariable);

                //builder.buildVariables(env, c.CatchVariable);
                //string catchvariablename = "0" + c.CatchVariable.Name + "_" + i + "_" + tryid;
                //Variable rtVariable = (Variable)MemberFinder.find(catchvariablename, env);
                //rtVariable.resetName(c.CatchVariable.Name);

                //rtVariable.valueType = RunTimeDataType.rt_void;

                OpStep op = new OpStep(OpCode.catch_error,
                                       new SourceToken(c.CatchVariable.token.line,
                                                       c.CatchVariable.token.ptr, c.CatchVariable.token.sourceFile));
                op.reg      = rtVariable;
                op.regType  = TypeReader.fromSourceCodeStr(c.CatchVariable.TypeStr, c.CatchVariable.token, builder);
                op.arg1     = new ASBinCode.rtData.RightValue(new ASBinCode.rtData.rtInt(tryid));
                op.arg1Type = RunTimeDataType.rt_int;
                op.arg2     = null;
                op.arg2Type = RunTimeDataType.unknown;

                env.block.opSteps.Add(op);

                {
                    OpStep enter_catch = new OpStep(OpCode.enter_catch, new SourceToken(c.CatchVariable.token.line, c.CatchVariable.token.ptr, c.CatchVariable.token.sourceFile));
                    enter_catch.arg1     = new ASBinCode.rtData.RightValue(new ASBinCode.rtData.rtInt(tryid));
                    enter_catch.arg1Type = RunTimeDataType.rt_int;
                    env.block.opSteps.Add(enter_catch);
                }

                int bstidx = env.block.opSteps.Count;
                for (int j = 0; j < c.CatchBlock.Count; j++)
                {
                    builder.buildStmt(env, c.CatchBlock[j]);
                }

                for (int k = bstidx; k < env.block.opSteps.Count; k++)
                {
                    var oop = env.block.opSteps[k];
                    if (Equals(oop.reg, rtVariable))
                    {
                        ((Variable)oop.reg).resetName("0" + rtVariable.name + "_" + i + "_" + tryid);
                    }
                    if (Equals(oop.arg1, rtVariable))
                    {
                        ((Variable)oop.arg1).resetName("0" + rtVariable.name + "_" + i + "_" + tryid);
                    }
                    if (Equals(oop.arg2, rtVariable))
                    {
                        ((Variable)oop.arg2).resetName("0" + rtVariable.name + "_" + i + "_" + tryid);
                    }
                }

                rtVariable.resetName("0" + rtVariable.name + "_" + i + "_" + tryid);

                {
                    OpStep quit_catch = new OpStep(OpCode.quit_catch, new SourceToken(c.CatchVariable.token.line, c.CatchVariable.token.ptr, c.CatchVariable.token.sourceFile));
                    quit_catch.arg1     = new ASBinCode.rtData.RightValue(new ASBinCode.rtData.rtInt(tryid));
                    quit_catch.arg1Type = RunTimeDataType.rt_int;
                    env.block.opSteps.Add(quit_catch);
                }

                {
                    jumpTo(env, as3try, builder, LBL_BEGIN_FINALLY);
                }
            }

            //FINALLY
            {
                OpStep finallylbl = new OpStep(OpCode.flag, new SourceToken(as3try.Token.line, as3try.Token.ptr, as3try.Token.sourceFile));
                finallylbl.flag = LBL_BEGIN_FINALLY;
                env.block.opSteps.Add(finallylbl);

                {
                    OpStep enter_finally = new OpStep(OpCode.enter_finally, new SourceToken(as3try.Token.line, as3try.Token.ptr, as3try.Token.sourceFile));
                    enter_finally.arg1     = new ASBinCode.rtData.RightValue(new ASBinCode.rtData.rtInt(tryid));
                    enter_finally.arg1Type = RunTimeDataType.rt_int;
                    env.block.opSteps.Add(enter_finally);
                }

                if (as3try.FinallyBlock != null)
                {
                    for (int i = 0; i < as3try.FinallyBlock.Count; i++)
                    {
                        builder.buildStmt(env, as3try.FinallyBlock[i]);
                    }
                }
                else
                {
                    if (as3try.CatchList.Count == 0)
                    {
                        throw new BuildException(as3try.Token.line,
                                                 as3try.Token.ptr,
                                                 as3try.Token.sourceFile, "try块至少要有1个catch块或1个finally块.");
                    }
                }

                {
                    OpStep quit_finally = new OpStep(OpCode.quit_finally, new SourceToken(as3try.Token.line, as3try.Token.ptr, as3try.Token.sourceFile));
                    quit_finally.arg1     = new ASBinCode.rtData.RightValue(new ASBinCode.rtData.rtInt(tryid));
                    quit_finally.arg1Type = RunTimeDataType.rt_int;
                    env.block.opSteps.Add(quit_finally);
                }

                OpStep endfinally = new OpStep(OpCode.flag, new SourceToken(as3try.Token.line, as3try.Token.ptr, as3try.Token.sourceFile));
                endfinally.flag = LBL_END_FINALLY;
                env.block.opSteps.Add(endfinally);
            }

            //trydepth--;



            //throw new BuildException(as3try.Token.line,as3try.Token.ptr,as3try.Token.sourceFile,"try catch finally编译没实现");
        }
        public void buildConstructor(CompileEnv env, ASTool.AS3.Expr.AS3ExprStep step, Builder builder)
        {
            if (step.OpCode == "new")
            {
                if (step.Arg1.IsReg)
                {
                    ASBinCode.rtti.Class _class = null;
                    if (step.Arg2.IsReg)
                    {
                        var cls = ExpressionBuilder.getRightValue(env, step.Arg2, step.token, builder);
                        if (cls is ASBinCode.StaticClassDataGetter)
                        {
                            _class = builder.getClassByRunTimeDataType(cls.valueType).instanceClass;
                            build_class(env, _class, step, builder);
                            return;
                        }
                        else if (cls is MethodGetterBase)
                        {
                            throw new BuildException(
                                      new BuildError(step.token.line, step.token.ptr, step.token.sourceFile,
                                                     "Method cannot be used as a constructor."));
                        }
                        else if (cls.valueType == ASBinCode.RunTimeDataType.rt_void || cls.valueType == ASBinCode.RunTimeDataType.rt_function)
                        {
                            //从Class对象中new
                            build_void(env, cls, step, builder);
                            return;
                        }
                        else if (cls.valueType > ASBinCode.RunTimeDataType.unknown)
                        {
                            _class = builder.getClassByRunTimeDataType(cls.valueType);

                            if (_class.isInterface)
                            {
                                throw new BuildException(
                                          new BuildError(step.token.line, step.token.ptr, step.token.sourceFile,
                                                         _class.name + " Interfaces cannot be instantiated with the new operator."));
                            }
                            else if (_class.staticClass != null)
                            {
                                build_class(env, _class, step, builder);
                            }
                            else if (cls is StackSlotAccessor && ((StackSlotAccessor)cls).isFindByPath && _class.staticClass == null)
                            {
                                build_class(env, _class.instanceClass, step, builder);
                            }
                            else
                            {
                                throw new BuildException(
                                          new BuildError(step.token.line, step.token.ptr, step.token.sourceFile,
                                                         "类型" + cls.valueType + "不能new"));
                            }
                            return;
                        }
                        else
                        {
                            throw new BuildException(
                                      new BuildError(step.token.line, step.token.ptr, step.token.sourceFile,
                                                     "类型" + cls.valueType + "不能new"));
                        }
                    }
                    else
                    {
                        //***查找对象类型
                        var find = TypeReader.findClassFromImports(step.Arg2.Data.Value.ToString(), builder, step.token);



                        if (find.Count == 1)
                        {
                            _class = find[0];

                            if (_class.isInterface)
                            {
                                throw new BuildException(
                                          new BuildError(step.token.line, step.token.ptr, step.token.sourceFile,
                                                         _class.name + " Interfaces cannot be instantiated with the new operator."));
                            }
                            else if (_class.no_constructor)
                            {
                            }
                            build_class(env, _class, step, builder);
                            return;
                        }
                        else
                        {
                            var cls = ExpressionBuilder.getRightValue(env, step.Arg2, step.token, builder);

                            if (cls is ASBinCode.StaticClassDataGetter)
                            {
                                _class = builder.getClassByRunTimeDataType(cls.valueType).instanceClass;
                                build_class(env, _class, step, builder);
                                return;
                            }
                            else if (cls is MethodGetterBase)
                            {
                                throw new BuildException(
                                          new BuildError(step.token.line, step.token.ptr, step.token.sourceFile,
                                                         "Method cannot be used as a constructor."));
                            }
                            else if (cls.valueType == ASBinCode.RunTimeDataType.rt_void || cls.valueType == ASBinCode.RunTimeDataType.rt_function)
                            {
                                //从Class对象中new
                                build_void(env, cls, step, builder);

                                return;
                            }
                            else if (cls.valueType > RunTimeDataType.unknown &&
                                     (builder.getClassByRunTimeDataType(cls.valueType).classid == 2
                                      ||
                                      builder.getClassByRunTimeDataType(cls.valueType).classid == 0
                                     ))
                            {
                                build_void(env, cls, step, builder);

                                return;
                            }
                            else
                            {
                                throw new BuildException(
                                          new BuildError(step.token.line, step.token.ptr, step.token.sourceFile,
                                                         "类型" + cls.valueType + "不能new"));
                            }
                        }
                    }
                }
                else
                {
                    throw new BuildException(
                              new BuildError(step.token.line, step.token.ptr, step.token.sourceFile,
                                             "编译异常 此处应该是个寄存器"));
                }
            }
            else
            {
                throw new BuildException(
                          new BuildError(step.token.line, step.token.ptr, step.token.sourceFile,
                                         "不支持的操作类型 " + step.Type + " " + step.OpCode));
            }
        }
 public static TypeReaderCriterion AsCriterion(this TypeReader reader, IServiceProvider?services = null) =>
 new TypeReaderCriterion(reader, services);
        public void buildInterfaceExtends(ASTool.AS3.AS3Interface as3interface, Builder builder)
        {
            var cls = builder.buildingclasses[as3interface];

            cls.staticClass.super = builder.getClassByRunTimeDataType(RunTimeDataType._OBJECT + 2);

            if (cls.isLink_System)
            {
                if (builder.bin.LinkObjectClass == null)
                {
                    throw new BuildException(as3interface.token.line, as3interface.token.ptr, as3interface.token.sourceFile,
                                             "未设置链接对象基类");
                }
                cls.super = builder.bin.LinkObjectClass;
            }
            else
            {
                cls.super = builder.bin.ObjectClass;
            }

            if (as3interface.ExtendsNames.Count > 0)
            {
                for (int i = 0; i < as3interface.ExtendsNames.Count; i++)
                {
                    string extendName = as3interface.ExtendsNames[i];
                    var    find       = TypeReader.findClassFromImports(extendName, builder, as3interface.token);

                    if (find.Count == 1)
                    {
                        if (!find[0].isInterface)
                        {
                            throw new BuildException(as3interface.token.line, as3interface.token.ptr, as3interface.token.sourceFile,
                                                     "An interface can only extend other interfaces, but " + extendName + " is a class.");
                        }
                        else if ((!cls.isLink_System) && find[0].isLink_System)
                        {
                            throw new BuildException(as3interface.token.line, as3interface.token.ptr, as3interface.token.sourceFile,
                                                     "非链接到系统的接口" + cls.name + " 不能继承链接到系统的接口 " + find[0].name);
                        }
                        else
                        {
                            if (!cls.implements.ContainsKey(find[0]))
                            {
                                cls.implements.Add(find[0], null);
                            }
                        }
                    }
                    else if (find.Count == 0)
                    {
                        throw new BuildException(as3interface.token.line, as3interface.token.ptr, as3interface.token.sourceFile,
                                                 "interface " + extendName + " was not found."
                                                 );
                    }
                    else
                    {
                        throw new BuildException(as3interface.token.line, as3interface.token.ptr, as3interface.token.sourceFile,
                                                 "Ambiguous reference to " + extendName
                                                 );
                    }
                }
            }
        }
Example #11
0
        internal void IssueElectronicCopyToReader(int IDMAIN, int IssuePeriodDays, string ViewKey, int IDREADER, TypeReader ReaderType)
        {
            DataSet ds = new DataSet();

            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                SqlCommand command = new SqlCommand(BJQueries.ISSUE_ELECTRONIC_COPY_TO_READER, connection);
                command.Parameters.Add("IDMAIN", SqlDbType.Int).Value          = IDMAIN;
                command.Parameters.Add("IssuePeriodDays", SqlDbType.Int).Value = IssuePeriodDays;
                command.Parameters.Add("ViewKey", SqlDbType.NVarChar).Value    = ViewKey;
                command.Parameters.Add("IDREADER", SqlDbType.Int).Value        = IDREADER;
                command.Parameters.Add("DateReturn", SqlDbType.DateTime).Value = DateTime.Now.AddDays(IssuePeriodDays);
                command.Parameters.Add("ReaderType", SqlDbType.Int).Value      = (int)ReaderType;

                connection.Open();
                command.ExecuteNonQuery();
            }
        }
Example #12
0
 public static ICriterion <T> AsCriterion <T>(this TypeReader reader, IServiceProvider?services = null)
     where T : SocketMessage =>
 reader.AsCriterion(services);
Example #13
0
 public OptionalTypeReader(TypeReader reader, IServiceProvider?services = null)
 {
     _reader   = reader;
     _services = services;
 }
Example #14
0
 /// <summary>
 /// Add a type reader.
 /// This needs the resulting type and the type of the .NET reader.
 /// Ex. String has type="System.String", readerType="Microsoft.Xna.Framework.Content.StringReader"
 /// </summary>
 /// <param name="type">The value type.</param>
 /// <param name="readerType">The reader type.</param>
 /// <param name="reader">The type reader.</param>
 public static void RegisterTypeReader(string type, string readerType, TypeReader reader)
 {
     readers.Add(type, reader);
     readers.Add(readerType, reader);
 }
Example #15
0
 public PromptCollection <T> WithTypeReader(TypeReader reader) => this.Modify(p => p.TypeReader = reader);
Example #16
0
 /// <summary>
 ///     Adds a custom <see cref="TypeReader" /> to this <see cref="CommandService" /> for the supplied object
 ///     type.
 ///     If <typeparamref name="T" /> is a <see cref="ValueType" />, a nullable <see cref="TypeReader" /> will
 ///     also be added.
 /// </summary>
 /// <typeparam name="T">The object type to be read by the <see cref="TypeReader" />.</typeparam>
 /// <param name="reader">An instance of the <see cref="TypeReader" /> to be added.</param>
 /// <param name="replaceDefault">
 ///     Defines whether the <see cref="TypeReader" /> should replace the default one for
 ///     <see cref="Type" /> if it exists.
 /// </param>
 public void AddTypeReader <T>(TypeReader reader, bool replaceDefault)
 {
     AddTypeReader(typeof(T), reader, replaceDefault);
 }
Example #17
0
 /// <summary>
 ///     Adds a custom <see cref="TypeReader" /> to this <see cref="CommandService" /> for the supplied object
 ///     type.
 ///     If <paramref name="type" /> is a <see cref="ValueType" />, a nullable <see cref="TypeReader" /> for the
 ///     value type will also be added.
 ///     If a default <see cref="TypeReader" /> exists for <paramref name="type" />, a warning will be logged and
 ///     the default <see cref="TypeReader" /> will be replaced.
 /// </summary>
 /// <param name="type">A <see cref="Type" /> instance for the type to be read.</param>
 /// <param name="reader">An instance of the <see cref="TypeReader" /> to be added.</param>
 public void AddTypeReader(Type type, TypeReader reader)
 {
     AddTypeReader(type, reader, true);
 }
Example #18
0
 //Type Readers
 /// <summary>
 ///     Adds a custom <see cref="TypeReader" /> to this <see cref="CommandService" /> for the supplied object
 ///     type.
 ///     If <typeparamref name="T" /> is a <see cref="ValueType" />, a nullable <see cref="TypeReader" /> will
 ///     also be added.
 ///     If a default <see cref="TypeReader" /> exists for <typeparamref name="T" />, a warning will be logged
 ///     and the default <see cref="TypeReader" /> will be replaced.
 /// </summary>
 /// <typeparam name="T">The object type to be read by the <see cref="TypeReader" />.</typeparam>
 /// <param name="reader">An instance of the <see cref="TypeReader" /> to be added.</param>
 public void AddTypeReader <T>(TypeReader reader)
 {
     AddTypeReader(typeof(T), reader);
 }
		ReorderableList CreateReorderableList(SerializedProperty listProp)
		{
			var list = new ReorderableList(listProp.serializedObject, listProp);
			var recorder = ((UniversalObserver)listProp.serializedObject.targetObject).GetRecorder();

			list.drawHeaderCallback +=
				(Rect position) =>
				{
					EditorGUI.LabelField(position, "Observation Targets");
				};

			list.elementHeightCallback =
				(int index) =>
				{
					if(listProp.arraySize == 0)
						return EditorGUIUtility.singleLineHeight + 10;

					var container = listProp.GetArrayElementAtIndex(index);
					var target = container.FindPropertyRelative("target");
					var keyChain = container.FindPropertyRelative("keys");
					var height = 0f;
					if (target.objectReferenceValue == null || keyChain.arraySize == 0)
					{
						height = EditorGUIUtility.singleLineHeight + 10;
					}
					else
					{
						height = EditorGUIUtility.singleLineHeight * (2 + keyChain.arraySize) + 10;
					}
					return height;
				};

			list.drawElementBackgroundCallback =
				(Rect position, int index, bool selected, bool focused) =>
				{
					position.height = list.elementHeightCallback(index);
					if (focused)
						EditorGUI.DrawRect(position, new Color(0.35f, 0.54f, 0.81f));
					else if (selected)
						EditorGUI.DrawRect(position, new Color(0.6f, 0.6f, 0.6f));
					else if ((index & 1) == 0)
						EditorGUI.DrawRect(position, new Color(0f, 0f, 0f, 0.1f));

				};

			list.drawElementCallback =
				(Rect position, int index, bool selected, bool focused) => 
				{
					var container = listProp.GetArrayElementAtIndex(index);

					var enabled = container.FindPropertyRelative("enabled");
					var target = container.FindPropertyRelative("target");
					var propName = container.FindPropertyRelative("propertyName");
					var keyChain = container.FindPropertyRelative("keys");
					var memberType = container.FindPropertyRelative("memberType");
					var ducTrigger = container.FindPropertyRelative("distinctUntilChanged");
					
					var mPos = new Rect(position);
					mPos.height = EditorGUIUtility.singleLineHeight;
					mPos.y += 5;

					if (target.objectReferenceValue != null)
					{
						mPos.xMin = mPos.xMax - 20;
						enabled.boolValue = EditorGUI.Toggle(mPos, enabled.boolValue);
						mPos.xMin = position.xMin;
					}
					else enabled.boolValue = true;
					EditorGUI.BeginDisabledGroup(!enabled.boolValue);

					var prevName = propName.stringValue;
					var type = TargetSelectField(mPos, target, propName, memberType);
					if (type == null)
					{
						keyChain.arraySize = 0;
					}
					else
					{
						if (prevName != propName.stringValue)
						{
							var reader = TypeReader.Get(type);
							if (reader != null)
							{
								var labels = reader.CreateKeyLabels();
								var prevLength = keyChain.arraySize;
								keyChain.arraySize = labels.Length;
								for (int i = 0; i < keyChain.arraySize; i++)
								{
									var elem = keyChain.GetArrayElementAtIndex(i);
									if (prevLength <= i)
										elem.FindPropertyRelative("key").intValue = -1;
									elem.FindPropertyRelative("label").stringValue = labels[i];
								}
							}
						}

						var recorderObj = new SerializedObject(recorder);
						for (int i = 0; i < keyChain.arraySize; i++)
						{
							var elem = keyChain.GetArrayElementAtIndex(i);
							var label = elem.FindPropertyRelative("label");
							var key = elem.FindPropertyRelative("key");

							mPos.y += mPos.height;
							key.intValue = GraphDataKeyAttributeDrawer.RecorderKeyField(
									mPos, recorderObj, label.stringValue, key.intValue, false);
						}

						mPos.y += mPos.height + 5;
						EditorGUI.PropertyField(mPos, ducTrigger);
					}
					EditorGUI.EndDisabledGroup();
				};
			return list;
		}
Example #20
0
        public void buildAccess(CompileEnv env, ASTool.AS3.Expr.AS3ExprStep step, Builder builder)
        {
            if (step.OpCode == ".")
            {
                if (step.Arg1.IsReg)
                {
                    ASBinCode.RightValueBase v1 = ExpressionBuilder.getRightValue(env, step.Arg2, step.token, builder);
                    if (step.Arg3.Data.FF1Type == ASTool.AS3.Expr.FF1DataValueType.identifier)
                    {
                        if (step.Arg3.Data.Value.ToString() == "null")
                        {
                            throw new BuildException(
                                      new BuildError(step.token.line, step.token.ptr, step.token.sourceFile,
                                                     "Syntax error: 'null' is not allowed here"));
                        }
                    }

                    //ASBinCode.IRightValue v2 = ExpressionBuilder.getRightValue(env, step.Arg3, step.token, builder);
                    if (v1 is ASBinCode.StaticClassDataGetter)
                    {
                        if (step.Arg3.Data.FF1Type == ASTool.AS3.Expr.FF1DataValueType.identifier)
                        {
                            ASBinCode.StaticClassDataGetter sd = (ASBinCode.StaticClassDataGetter)v1;
                            var cls = sd._class;

                            build_class(env, step, v1, cls, builder);
                        }
                        else
                        {
                            throw new BuildException(
                                      new BuildError(step.token.line, step.token.ptr, step.token.sourceFile,
                                                     "静态成员名期待一个identifier"));
                        }
                    }
                    else if (v1 is PackagePathGetter)
                    {
                        if (step.Arg3.Data.FF1Type == ASTool.AS3.Expr.FF1DataValueType.identifier)
                        {
                            PackagePathGetter pd   = (PackagePathGetter)v1;
                            string            path = pd.path + "." + step.Arg3.Data.Value.ToString();

                            //**尝试查找类***

                            var found = TypeReader.findClassFromProject(path, builder, step.token);
                            if (found.Count == 1)
                            {
                                var item = found[0];

                                OpStep stepInitClass = new OpStep(OpCode.init_staticclass,
                                                                  new SourceToken(step.token.line, step.token.ptr, step.token.sourceFile));
                                stepInitClass.arg1 = new ASBinCode.rtData.RightValue(
                                    new ASBinCode.rtData.rtInt(item.classid));
                                stepInitClass.arg1Type = item.staticClass.getRtType();
                                env.block.opSteps.Add(stepInitClass);

                                ASBinCode.StackSlotAccessor eax = env.createASTRegister(step.Arg1.Reg);
                                eax.setEAXTypeWhenCompile(item.staticClass.getRtType());
                                eax.isFindByPath = true;
                                //eax._pathGetter = new PackagePathGetter(path);

                                OpStep op = new OpStep(OpCode.assigning, new SourceToken(step.token.line, step.token.ptr, step.token.sourceFile));
                                op.reg      = eax;
                                op.arg1     = new StaticClassDataGetter(item.staticClass);
                                op.arg1Type = item.staticClass.getRtType();

                                env.block.opSteps.Add(op);
                            }
                            else if (found.Count > 1)
                            {
                                throw new BuildException(step.token.line, step.token.ptr, step.token.sourceFile,
                                                         "类型" + path + "不明确."
                                                         );
                            }
                            else
                            {
                                //没找到
                                PackagePathGetter           g   = new PackagePathGetter(path);
                                ASBinCode.StackSlotAccessor eax = env.createASTRegister(step.Arg1.Reg);
                                eax.setEAXTypeWhenCompile(RunTimeDataType.unknown);
                                eax._pathGetter = g;
                            }
                        }
                        else
                        {
                            throw new BuildException(
                                      new BuildError(step.token.line, step.token.ptr, step.token.sourceFile,
                                                     "静态成员名期待一个identifier"));
                        }
                    }
                    else if (v1 is ThisPointer && v1.valueType == RunTimeDataType.rt_void)
                    {
                        //throw new BuildException(
                        //   new BuildError(step.token.line, step.token.ptr, step.token.sourceFile,
                        //   "动态查找成员 还没弄"));

                        if (step.Arg3.Data.FF1Type == ASTool.AS3.Expr.FF1DataValueType.identifier)
                        {
                            build_dot_name(env, step, v1);
                        }
                        else
                        {
                            throw new BuildException(
                                      new BuildError(step.token.line, step.token.ptr, step.token.sourceFile,
                                                     "静态成员名期待一个identifier"));
                        }
                    }
                    else if (v1.valueType == RunTimeDataType.unknown)
                    {
                        throw new BuildException(
                                  new BuildError(step.token.line, step.token.ptr, step.token.sourceFile,
                                                 "遇到了unknown类型"));
                    }
                    else if (v1.valueType > RunTimeDataType.unknown)
                    {
                        ASBinCode.rtti.Class cls = builder.getClassByRunTimeDataType(v1.valueType);

                        if (cls == null)
                        {
                            throw new BuildException(
                                      new BuildError(step.token.line, step.token.ptr, step.token.sourceFile,
                                                     "编译异常 类型" + v1.valueType + "未找到"));
                        }
                        else
                        {
                            build_class(env, step, v1, cls, builder);
                        }
                    }
                    else
                    {
                        if (v1.valueType != RunTimeDataType.rt_void && v1.valueType < RunTimeDataType.unknown)
                        {
                            if (
                                builder.bin != null &&
                                builder.bin.primitive_to_class_table[v1.valueType] != null)
                            {
                                var cls = builder.bin.primitive_to_class_table[v1.valueType];
                                v1 = ExpressionBuilder.addCastOpStep(env, v1, builder.bin.primitive_to_class_table[v1.valueType].getRtType(),
                                                                     new SourceToken(step.token.line, step.token.ptr, step.token.sourceFile)
                                                                     , builder
                                                                     );
                                build_class(env, step, v1, cls, builder);
                            }
                            else
                            {
                                throw new BuildException(
                                          new BuildError(step.token.line, step.token.ptr, step.token.sourceFile,
                                                         "基础类型" + v1.valueType + "无法转换为引用类型"));
                            }
                        }
                        else
                        {
                            if (step.Arg3.Data.FF1Type == ASTool.AS3.Expr.FF1DataValueType.identifier)
                            {
                                build_dot_name(env, step, v1);
                            }
                            else
                            {
                                throw new BuildException(
                                          new BuildError(step.token.line, step.token.ptr, step.token.sourceFile,
                                                         "静态成员名期待一个identifier"));
                            }
                        }
                    }
                }
                else
                {
                    throw new BuildException(
                              new BuildError(step.token.line, step.token.ptr, step.token.sourceFile,
                                             "编译异常 此处应该是个寄存器"));
                }
            }
            else if (step.OpCode == "[")             //和.作用相同
            {
                if (step.Arg1.IsReg)
                {
                    ASBinCode.RightValueBase v1 = ExpressionBuilder.getRightValue(env, step.Arg2, step.token, builder);
                    if (v1 is ASBinCode.StaticClassDataGetter)
                    {
                        build_bracket_access(env, step, v1, builder);
                    }
                    else if (v1 is PackagePathGetter)
                    {
                        if (step.Arg3.Data.FF1Type == ASTool.AS3.Expr.FF1DataValueType.identifier)
                        {
                            PackagePathGetter pd   = (PackagePathGetter)v1;
                            string            path = pd.path + "." + step.Arg3.Data.Value.ToString();

                            //**尝试查找类***

                            //查找导入的类
                            var found = TypeReader.findClassFromImports(path, builder, step.token);
                            if (found.Count == 1)
                            {
                                var item = found[0];

                                OpStep stepInitClass = new OpStep(OpCode.init_staticclass,
                                                                  new SourceToken(step.token.line, step.token.ptr, step.token.sourceFile));
                                stepInitClass.arg1 = new ASBinCode.rtData.RightValue(
                                    new ASBinCode.rtData.rtInt(item.classid));
                                stepInitClass.arg1Type = item.staticClass.getRtType();
                                env.block.opSteps.Add(stepInitClass);

                                ASBinCode.StackSlotAccessor eax = env.createASTRegister(step.Arg1.Reg);
                                eax.setEAXTypeWhenCompile(item.getRtType());

                                OpStep op = new OpStep(OpCode.assigning, new SourceToken(step.token.line, step.token.ptr, step.token.sourceFile));
                                op.reg      = eax;
                                op.arg1     = new StaticClassDataGetter(item.staticClass);
                                op.arg1Type = item.staticClass.getRtType();

                                env.block.opSteps.Add(op);

                                build_bracket_access(env, step, v1, builder);
                            }
                            else
                            {
                                throw new BuildException(step.token.line, step.token.ptr, step.token.sourceFile,
                                                         "类型" + path + "不明确."
                                                         );
                            }
                        }
                        else
                        {
                            throw new BuildException(
                                      new BuildError(step.token.line, step.token.ptr, step.token.sourceFile,
                                                     "静态成员名期待一个identifier"));
                        }
                    }
                    else if (v1 is ThisPointer && v1.valueType == RunTimeDataType.rt_void)
                    {
                        if (step.Arg3.Data.FF1Type == ASTool.AS3.Expr.FF1DataValueType.identifier)
                        {
                            build_bracket_access(env, step, v1, builder);
                        }
                        else
                        {
                            throw new BuildException(
                                      new BuildError(step.token.line, step.token.ptr, step.token.sourceFile,
                                                     "静态成员名期待一个identifier"));
                        }
                    }
                    else if (v1.valueType == RunTimeDataType.unknown)
                    {
                        throw new BuildException(
                                  new BuildError(step.token.line, step.token.ptr, step.token.sourceFile,
                                                 "遇到了unknown类型"));
                    }
                    else if (v1.valueType > RunTimeDataType.unknown)
                    {
                        ASBinCode.rtti.Class cls = builder.getClassByRunTimeDataType(v1.valueType);

                        if (cls == null)
                        {
                            throw new BuildException(
                                      new BuildError(step.token.line, step.token.ptr, step.token.sourceFile,
                                                     "编译异常 类型" + v1.valueType + "未找到"));
                        }
                        else
                        {
                            //**todo**检查如果是数组的情况****

                            build_bracket_access(env, step, v1, builder);
                        }
                    }
                    else
                    {
                        if (v1.valueType == RunTimeDataType.rt_array)
                        {
                            var v2 = ExpressionBuilder.getRightValue(env, step.Arg3, step.token, builder);
                            if (v2.valueType == RunTimeDataType.rt_int || v2.valueType == RunTimeDataType.rt_number || v2.valueType == RunTimeDataType.rt_uint)
                            {
                                build_bracket_access(env, step, v1, builder);
                            }
                            else
                            {
                                v1 = ExpressionBuilder.addCastOpStep(env, v1, builder.bin.primitive_to_class_table[v1.valueType].getRtType(),
                                                                     new SourceToken(step.token.line, step.token.ptr, step.token.sourceFile)
                                                                     , builder
                                                                     );
                                build_bracket_access(env, step, v1, builder);
                            }
                        }
                        else if (v1.valueType != RunTimeDataType.rt_void && v1.valueType < RunTimeDataType.unknown
                                 )
                        {
                            if (builder.bin.primitive_to_class_table[v1.valueType] != null)
                            {
                                v1 = ExpressionBuilder.addCastOpStep(env, v1, builder.bin.primitive_to_class_table[v1.valueType].getRtType(),
                                                                     new SourceToken(step.token.line, step.token.ptr, step.token.sourceFile)
                                                                     , builder
                                                                     );
                                build_bracket_access(env, step, v1, builder);
                            }
                            else
                            {
                                throw new BuildException(
                                          new BuildError(step.token.line, step.token.ptr, step.token.sourceFile,
                                                         "基础类型" + v1.valueType + "无法转换为引用类型"));
                            }
                        }
                        else
                        {
                            build_bracket_access(env, step, v1, builder);
                        }
                    }
                }
                else
                {
                    throw new BuildException(
                              new BuildError(step.token.line, step.token.ptr, step.token.sourceFile,
                                             "编译异常 此处应该是个寄存器"));
                }
            }
            else
            {
                throw new BuildException(
                          new BuildError(step.token.line, step.token.ptr, step.token.sourceFile,
                                         "不支持的操作类型 " + step.Type + " " + step.OpCode));
            }
        }
Example #21
0
 public TypeReaderCriterion(TypeReader reader, IServiceProvider?services = null)
 {
     _reader   = reader;
     _services = services;
 }
 public ClientBuilder AddTypeReader <T>(TypeReader reader)
 => AddTypeReader(typeof(T), reader);
Example #23
0
 public ModuleDocumentationGenerator WithTypeReader <T>(TypeReader typeReader)
 {
     this.Commands.AddTypeReader <T>(typeReader);
     return(this);
 }