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; }); }
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)); } }
/// <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); } } }
public NullableSerializer(TypeSerializer <T> serializer) { _serializer = serializer; _reader = _serializer.GetReader(); _writer = _serializer.GetWriter(); }
//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 ); } } } }
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(); } }
public static ICriterion <T> AsCriterion <T>(this TypeReader reader, IServiceProvider?services = null) where T : SocketMessage => reader.AsCriterion(services);
public OptionalTypeReader(TypeReader reader, IServiceProvider?services = null) { _reader = reader; _services = services; }
/// <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); }
public PromptCollection <T> WithTypeReader(TypeReader reader) => this.Modify(p => p.TypeReader = reader);
/// <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); }
/// <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); }
//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; }
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)); } }
public TypeReaderCriterion(TypeReader reader, IServiceProvider?services = null) { _reader = reader; _services = services; }
public ClientBuilder AddTypeReader <T>(TypeReader reader) => AddTypeReader(typeof(T), reader);
public ModuleDocumentationGenerator WithTypeReader <T>(TypeReader typeReader) { this.Commands.AddTypeReader <T>(typeReader); return(this); }