Пример #1
0
        private static bool ValidateItem(ProjectItem item, IClassFinder classFinder, IStructFinder structFinder, IFunctionFinder functionFinder)
        {
            IList <CodeNamespace> codeNamespaces;
            IList <CodeClass>     codeClasses;
            IList <CodeStruct>    codeStructs;
            IList <CodeFunction>  codeFunctions;
            FileCodeModel         fcm      = item.FileCodeModel;
            CodeElements          elements = null;

            if (fcm != null)
            {
                elements = fcm.CodeElements;
            }

            codeNamespaces = fcm != null?EditorHelper.GetList <CodeNamespace>(elements, vsCMElement.vsCMElementNamespace) : null;

            codeClasses = classFinder != null && fcm != null
                              ? EditorHelper.GetList <CodeClass>(elements, vsCMElement.vsCMElementClass)
                              : null;

            codeStructs = structFinder != null && fcm != null
                              ? EditorHelper.GetList <CodeStruct>(elements, vsCMElement.vsCMElementStruct)
                              : null;

            codeFunctions = (classFinder != null || structFinder != null) && fcm != null
                                ? EditorHelper.GetList <CodeFunction>(elements, vsCMElement.vsCMElementFunction)
                                : null;

            return(InternalEnumeration(item, codeNamespaces, codeClasses, codeStructs, codeFunctions, classFinder,
                                       structFinder, functionFinder));
        }
Пример #2
0
        private static bool InternalEnumeration(ProjectItem item, IClassFinder classFinder, IStructFinder structFinder, IFunctionFinder functionFinder)
        {
            ProjectItems subItems;

            if (item != null)
            {
                if (ValidateItem(item, classFinder, structFinder, functionFinder))
                {
                    return(true);
                }

                subItems = item.ProjectItems;

                if (subItems != null && subItems.Count > 0)
                {
                    foreach (ProjectItem x in subItems)
                    {
                        if (ValidateItem(x, classFinder, structFinder, functionFinder))
                        {
                            return(true);
                        }
                    }
                }
            }

            return(false);
        }
        public static void RegisterDependencies(
            this IServiceCollection collection,
            IClassFinder classFinder,
            Func <string, bool> canRegister)
        {
            var assemblyFinder = new AssemblyFinder();
            var assemblies     = assemblyFinder.FindAssemblies(null);
            Dictionary <string, bool> registeredResponses = new Dictionary <string, bool>();

            var classesToRegister = classFinder.FindRegisteredClasses(assemblies);
            var serviceCollection = new ServiceContainer(collection);

            foreach (var item in classesToRegister)
            {
                if (!registeredResponses.ContainsKey(item.Environment))
                {
                    var envCanRegister = canRegister(item.Environment);
                    registeredResponses.Add(item.Environment, envCanRegister);
                }

                if (registeredResponses[item.Environment])
                {
                    classFinder.RegisterClass(item.Type, serviceCollection, null);
                }
            }
        }
Пример #4
0
        /// <summary>
        /// Open code editor window and set the cursor at the start of particular class or structure.
        /// Returns 'true' if editor opened, otherwise 'false'.
        /// </summary>
        public static bool Activate(IList <Project> projects, IClassFinder classFinder, IStructFinder structFinder, IFunctionFinder functionFinder)
        {
            // nothing to do:
            if ((classFinder == null && structFinder == null) || projects == null || projects.Count == 0)
            {
                return(false);
            }

            foreach (Project prj in projects)
            {
                ProjectItems pi = prj.ProjectItems;

                for (int i = 1; i < pi.Count; i++)
                {
                    ProjectItem f = pi.Item(i);

                    if (InternalEnumeration(f, classFinder, structFinder, functionFinder))
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }
        /// <summary>
        /// Registers the first discovered occurrence of
        /// </summary>
        /// <param name="collection">Service collection</param>
        /// <param name="classFinder">EasyIoC finder</param>
        /// <param name="Environment">Environment to register instances for</param>
        public static void RegisterDependencies(
            this IServiceCollection collection,
            IClassFinder classFinder,
            string Environment = null)
        {
            var assemblyFinder = new AssemblyFinder();
            var assemblies     = assemblyFinder.FindAssemblies(null);

            var classesToRegister = classFinder.FindRegisteredClasses(assemblies);
            var serviceCollection = new ServiceContainer(collection);

            List <Discoverable> environmentBasedClasses = new List <Discoverable>();

            // Pushing onto this list gives us a way to use the non-environment
            // based classes first, if none was specified
            foreach (var item in classesToRegister)
            {
                if (Environment == null && item.Environment != null)
                {
                    environmentBasedClasses.Add(item);
                }
                else
                {
                    classFinder.RegisterClass(item.Type, serviceCollection, Environment);
                }
            }

            foreach (var item in classesToRegister)
            {
                classFinder.RegisterClass(item.Type, serviceCollection, Environment);
            }
        }
Пример #6
0
 public ObjectMemberSlot(ASBinCode.rtData.rtObjectBase obj, RunTimeDataType FunctionClassRtType, RunTimeDataType slottype, IClassFinder classfinder)
 {
     this.obj                 = obj;
     this.isConstMember       = false;
     this.FunctionClassRtType = FunctionClassRtType;
     this.slottype            = slottype;
     this.classfinder         = classfinder;
 }
        public static bool check_isinherits(RunTimeDataType srcType, RunTimeDataType type, IClassFinder classfinder)
        {
            var srcCls = classfinder.getClassByRunTimeDataType(srcType);
            var cls    = classfinder.getClassByRunTimeDataType(type);

            return(isInherits(srcCls, cls));
        }
        public static bool check_isImplements(RunTimeValueBase value, RunTimeDataType type, IClassFinder classfinder)
        {
            var cls = classfinder.getClassByRunTimeDataType(type);

            return(isImplements(((rtData.rtObjectBase)value).value._class, cls));
        }
Пример #9
0
        /// <summary>
        /// Recursive enumeration of all solution items.
        /// </summary>
        private static bool InternalEnumeration(ProjectItem item, IList <CodeNamespace> codeNamespaces,
                                                IList <CodeClass> codeClasses, IList <CodeStruct> codeStructs,
                                                IList <CodeFunction> codeFunctions,
                                                IClassFinder classFinder, IStructFinder structFinder, IFunctionFinder functionFinder)
        {
            IList <CodeNamespace> interNamespaces;
            IList <CodeClass>     interClasses;
            IList <CodeStruct>    interStructs;
            IList <CodeFunction>  internalFunctions;
            CodeElements          elements;

            // enumerate through all namespaces:
            if (codeNamespaces != null)
            {
                foreach (CodeNamespace n in codeNamespaces)
                {
                    elements        = n.Members;
                    interNamespaces = EditorHelper.GetList <CodeNamespace>(elements, vsCMElement.vsCMElementNamespace);

                    interClasses = classFinder != null?EditorHelper.GetList <CodeClass>(elements, vsCMElement.vsCMElementClass) : null;

                    interStructs = structFinder != null?EditorHelper.GetList <CodeStruct>(elements, vsCMElement.vsCMElementStruct) : null;

                    internalFunctions = EditorHelper.GetList <CodeFunction>(elements, vsCMElement.vsCMElementFunction);

                    if (InternalEnumeration(item, interNamespaces, interClasses, interStructs, internalFunctions, classFinder, structFinder, functionFinder))
                    {
                        return(true);
                    }
                }
            }

            // enumerate classes:
            if (codeClasses != null && classFinder != null)
            {
                foreach (CodeClass c in codeClasses)
                {
                    if (classFinder.MatchCriteria(c))
                    {
                        Window        w   = item.Open(Constants.vsViewKindTextView);
                        TextSelection sel = w.Selection as TextSelection;

                        classFinder.Activate(item, c, w, sel);
                        return(true);
                    }

                    interClasses = EditorHelper.GetList <CodeClass>(c.Members, vsCMElement.vsCMElementClass);

                    if (codeStructs != null)
                    {
                        interStructs = EditorHelper.GetList <CodeStruct>(c.Members, vsCMElement.vsCMElementStruct);
                    }
                    else
                    {
                        interStructs = null;
                    }

                    if (InternalEnumeration(item, null, interClasses, interStructs, null, classFinder, structFinder, null))
                    {
                        return(true);
                    }
                }
            }

            // enumerate structures:
            if (codeStructs != null && structFinder != null)
            {
                foreach (CodeStruct s in codeStructs)
                {
                    if (structFinder.MatchCriteria(s))
                    {
                        Window        w   = item.Open(Constants.vsViewKindTextView);
                        TextSelection sel = w.Selection as TextSelection;

                        structFinder.Activate(item, s, w, sel);
                        return(true);
                    }

                    if (classFinder != null)
                    {
                        interClasses = EditorHelper.GetList <CodeClass>(s.Members, vsCMElement.vsCMElementClass);
                    }
                    else
                    {
                        interClasses = null;
                    }
                    interStructs = EditorHelper.GetList <CodeStruct>(s.Members, vsCMElement.vsCMElementStruct);

                    if (InternalEnumeration(item, null, interClasses, interStructs, null, classFinder, structFinder, null))
                    {
                        return(true);
                    }
                }
            }

            // enumerate all global functions:
            if (codeFunctions != null && functionFinder != null)
            {
                foreach (CodeFunction f in codeFunctions)
                {
                    if (functionFinder.MatchCriteria(f))
                    {
                        Window        w   = item.Open(Constants.vsViewKindTextView);
                        TextSelection sel = w.Selection as TextSelection;

                        functionFinder.Activate(item, f, w, sel);
                        return(true);
                    }
                }
            }

            return(false);
        }
 public vectorSLot(ASBinCode.rtti.Vector_Data vector_data,int idx,IClassFinder classfinder)
 {
     this.vector_data = vector_data;
     this.idx         = idx;
     this.classfinder = classfinder;
 }
        public bool rtValueToLinkObject
            (RunTimeValueBase value,Type linkType,IClassFinder bin,bool needclone,out object linkobject)
        {
            RunTimeDataType vt = value.rtType;

            if (vt == RunTimeDataType.rt_null)
            {
                linkobject = null;
                return(true);
            }

            if (vt > RunTimeDataType.unknown)
            {
                var cls = bin.getClassByRunTimeDataType(vt);

                RunTimeDataType ot;
                if (TypeConverter.Object_CanImplicit_ToPrimitive(
                        cls,out ot
                        ))
                {
                    vt    = ot;
                    value = TypeConverter.ObjectImplicit_ToPrimitive((ASBinCode.rtData.rtObjectBase)value);
                }
                else if (linkType is AS3Class_Type && cls.staticClass == null)
                {
                    if (cls.getRtType() == ((AS3Class_Type)linkType).rttype)
                    {
                        linkobject = ((AS3Class_Type)linkType).linktype;
                        return(true);
                    }
                }
            }
            RunTimeDataType at =
                getRuntimeDataType(
                    linkType);

            if (at == RunTimeDataType.rt_int)
            {
                linkobject = (TypeConverter.ConvertToInt(value));
            }
            else if (at == RunTimeDataType.rt_uint)
            {
                linkobject = (TypeConverter.ConvertToUInt(value,null,null));
            }
            else if (at == RunTimeDataType.rt_string)
            {
                linkobject = (TypeConverter.ConvertToString(value,null,null));
            }
            else if (at == RunTimeDataType.rt_number)
            {
                linkobject = (TypeConverter.ConvertToNumber(value));
            }
            else if (at == RunTimeDataType.rt_boolean)
            {
                var b = TypeConverter.ConvertToBoolean(value,null,null);
                linkobject = b.value;
            }
            else if (at == RunTimeDataType.rt_array)
            {
                linkobject = (ASBinCode.rtData.rtArray)value;
            }
            else if (at == RunTimeDataType.rt_function)
            {
                if (needclone)
                {
                    linkobject = (ASBinCode.rtData.rtFunction)value;
                }
                else
                {
                    linkobject = ((ASBinCode.rtData.rtFunction)value).Clone();
                }
            }
            else if (at == _OBJECT_LINK)
            {
                if (vt > RunTimeDataType.unknown)
                {
                    if (needclone)
                    {
                        linkobject = ((ASBinCode.rtData.rtObjectBase)value).Clone();
                    }
                    else
                    {
                        linkobject = (ASBinCode.rtData.rtObjectBase)value;
                    }
                }
                else
                {
                    if (needclone)
                    {
                        linkobject = value.Clone();
                    }
                    else
                    {
                        linkobject = value;
                    }
                }
            }
            else if (at > RunTimeDataType.unknown)
            {
                if (vt > RunTimeDataType.unknown)
                {
                    Class c = bin.getClassByRunTimeDataType(vt);
                    if (c.isLink_System)
                    {
                        LinkSystemObject lo = (LinkSystemObject)((ASBinCode.rtData.rtObjectBase)value).value;
                        linkobject = lo.GetLinkData();
                    }
                    else if (c.isCrossExtend)
                    {
                        LinkSystemObject lo = (LinkSystemObject)((ASBinCode.rtData.rtObjectBase)value).value;
                        linkobject = lo.GetLinkData();
                    }
                    else if (c.staticClass == null)
                    {
                        if (c.instanceClass.isCrossExtend)
                        {
                            //***isCrossExtend Class转换为 基础类型的type
                            var sc = c.instanceClass.super;
                            while (!sc.isLink_System)
                            {
                                sc = sc.super;
                            }

                            var nf = (ICrossExtendAdapterCreator)swc.getNativeFunction(((ClassMethodGetter)sc.crossExtendAdapterCreator.bindField).functionId);

                            linkobject = nf.GetAdapterType();
                        }
                        else
                        {
                            linkobject = null;
                            return(false);
                        }
                    }
                    else
                    {
                        linkobject = null;
                        return(false);
                    }
                }
                else if (at == _objectType_) //托管object
                {
                    if (vt == RunTimeDataType.rt_int)
                    {
                        linkobject = (TypeConverter.ConvertToInt(value));
                    }
                    else if (vt == RunTimeDataType.rt_uint)
                    {
                        linkobject = (TypeConverter.ConvertToUInt(value,null,null));
                    }
                    else if (vt == RunTimeDataType.rt_string)
                    {
                        linkobject = (TypeConverter.ConvertToString(value,null,null));
                    }
                    else if (vt == RunTimeDataType.rt_number)
                    {
                        linkobject = (TypeConverter.ConvertToNumber(value));
                    }
                    else if (vt == RunTimeDataType.rt_boolean)
                    {
                        var b = TypeConverter.ConvertToBoolean(value,null,null);
                        linkobject = b.value;
                    }
                    else if (vt == RunTimeDataType.rt_void)
                    {
                        linkobject = null;
                    }
                    else
                    {
                        linkobject = null;
                        return(false);
                    }
                }
                else
                {
                    linkobject = null;
                    return(false);
                }
            }
            else
            {
                linkobject = null;
                return(false);
            }

            return(true);
        }
        public void storeLinkObject_ToSlot(object obj, RunTimeDataType defineReturnType, SLOT returnSlot,IClassFinder bin,Player player)
        {
            if (obj is ICrossExtendAdapter)
            {
                obj = ((ICrossExtendAdapter)obj).AS3Object;
            }

            if (obj == null)
            {
                returnSlot.setValue(ASBinCode.rtData.rtNull.nullptr);
            }
            else
            {
                RunTimeDataType rt = defineReturnType;                 //getLinkType(funcDefine.signature.returnType);
                //RunTimeDataType rt =
                //    getRuntimeDataType(obj.GetType());
                if (rt == RunTimeDataType.rt_void)
                {
                    rt = getRuntimeDataType(obj.GetType());

                    if (rt == _FLOAT)
                    {
                        rt = RunTimeDataType.rt_number;
                    }
                    else if (rt == _SHORT)
                    {
                        rt = RunTimeDataType.rt_int;
                    }
                    else if (rt == _USHORT)
                    {
                        rt = RunTimeDataType.rt_uint;
                    }
                }

                if (rt == _DICT_KEY)
                {
                    DictionaryKey key = (DictionaryKey)obj;
                    rt  = _OBJECT_LINK;
                    obj = key.key;
                }

                if (rt == RunTimeDataType._OBJECT)
                {
                    rt = _OBJECT_LINK;
                }
                if (rt == _OBJECT_LINK)
                {
                    rt = ((RunTimeValueBase)obj).rtType;
                    if (rt < RunTimeDataType.unknown)                    //否则走下面的Object路径
                    {
                        returnSlot.directSet((RunTimeValueBase)obj);
                        return;
                    }
                }

                if (rt == RunTimeDataType.rt_int)
                {
                    var realObjType = getRuntimeDataType(obj.GetType());
                    if (realObjType == RunTimeDataType.rt_uint)
                    {
                        returnSlot.setValue((int)(uint)obj);
                    }
                    else if (realObjType == RunTimeDataType.rt_number)
                    {
                        returnSlot.setValue((int)(double)obj);
                    }
                    else if (realObjType == _FLOAT)
                    {
                        returnSlot.setValue((int)(float)obj);
                    }
                    else if (realObjType == _SHORT)
                    {
                        returnSlot.setValue((int)(short)obj);
                    }
                    else if (realObjType == _USHORT)
                    {
                        returnSlot.setValue((int)(ushort)obj);
                    }
                    else
                    {
                        returnSlot.setValue((int)obj);
                    }
                }
                else if (rt == RunTimeDataType.rt_uint)
                {
                    var realObjType = getRuntimeDataType(obj.GetType());
                    if (realObjType == RunTimeDataType.rt_int)
                    {
                        returnSlot.setValue((uint)(int)obj);
                    }
                    else if (realObjType == RunTimeDataType.rt_number)
                    {
                        returnSlot.setValue((uint)(double)obj);
                    }
                    else if (realObjType == _FLOAT)
                    {
                        returnSlot.setValue((uint)(float)obj);
                    }
                    else if (realObjType == _SHORT)
                    {
                        returnSlot.setValue((uint)(short)obj);
                    }
                    else if (realObjType == _USHORT)
                    {
                        returnSlot.setValue((uint)(ushort)obj);
                    }
                    else
                    {
                        returnSlot.setValue((uint)obj);
                    }
                }
                else if (rt == RunTimeDataType.rt_string)
                {
                    var realObjType = getRuntimeDataType(obj.GetType());
                    returnSlot.setValue((string)obj);
                }
                else if (rt == RunTimeDataType.rt_number)
                {
                    var realObjType = getRuntimeDataType(obj.GetType());
                    if (realObjType == RunTimeDataType.rt_uint)
                    {
                        returnSlot.setValue((double)(uint)obj);
                    }
                    else if (realObjType == RunTimeDataType.rt_int)
                    {
                        returnSlot.setValue((double)(int)obj);
                    }
                    else if (realObjType == _FLOAT)
                    {
                        returnSlot.setValue((double)(float)obj);
                    }
                    else if (realObjType == _SHORT)
                    {
                        returnSlot.setValue((double)(short)obj);
                    }
                    else if (realObjType == _USHORT)
                    {
                        returnSlot.setValue((double)(ushort)obj);
                    }
                    else
                    {
                        returnSlot.setValue((double)obj);
                    }
                }
                else if (rt == RunTimeDataType.rt_boolean)
                {
                    if ((bool)obj)
                    {
                        returnSlot.setValue(ASBinCode.rtData.rtBoolean.True);
                    }
                    else
                    {
                        returnSlot.setValue(ASBinCode.rtData.rtBoolean.False);
                    }
                }
                else if (rt == RunTimeDataType.rt_array)
                {
                    returnSlot.directSet((ASBinCode.rtData.rtArray)obj);
                }
                else if (rt == RunTimeDataType.rt_function)
                {
                    returnSlot.directSet((ASBinCode.rtData.rtFunction)obj);
                }
                else if (rt > RunTimeDataType.unknown)
                {
                    Class rtCls;                    // = ((ASBinCode.rtData.rtObject)obj).value._class; //bin.getClassByRunTimeDataType(rt);
                    ASBinCode.rtData.rtObjectBase testObj = obj as ASBinCode.rtData.rtObjectBase;
                    if (testObj != null)
                    {
                        rtCls = ((ASBinCode.rtData.rtObjectBase)obj).value._class;

                        if (rtCls.isLink_System)
                        {
                            var f = ((CSWC)bin).class_Creator[rtCls];
                            f.setLinkObjectValueToSlot(returnSlot,player,
                                                       ((LinkSystemObject)testObj.value).GetLinkData(),rtCls);
                        }
                        else
                        {
                            returnSlot.directSet((ASBinCode.rtData.rtObjectBase)obj);
                        }
                    }
                    else
                    {
                        rtCls = bin.getClassByRunTimeDataType(rt);

                        if (rtCls.classid == player.swc.TypeClass.classid)
                        {
                            Type type = obj as Type;
                            if (type != null)
                            {
                                try
                                {
                                    var rttype = getRuntimeDataType(type);
                                    if (rttype < RunTimeDataType.unknown
                                        &&
                                        player.swc.primitive_to_class_table[rttype] != null
                                        )
                                    {
                                        rttype = player.swc.primitive_to_class_table[rttype].getRtType();
                                    }

                                    var rtcls = bin.getClassByRunTimeDataType(rttype);

                                    if (player.init_static_class(rtcls,SourceToken.Empty))
                                    {
                                        returnSlot.directSet(
                                            player.static_instance[rtcls.staticClass.classid]);
                                    }
                                    else
                                    {
                                        throw new ASRunTimeException("转换Class失败",String.Empty);
                                    }
                                }
                                catch (KeyNotFoundException)
                                {
                                    throw new TypeLinkClassException(type.FullName + " 没有链接到脚本");
                                }
                            }
                            else
                            {
                                throw new ASRunTimeException("没有将Class链接到Type",String.Empty);
                            }
                        }
                        else
                        {
                            var f = ((CSWC)bin).class_Creator[rtCls];
                            f.setLinkObjectValueToSlot(returnSlot,player,obj,rtCls);
                        }
                    }
                }
                else
                {
                    throw new ASRunTimeException("意外的链接类型",String.Empty);
                }
            }
        }
Пример #13
0
 public InjectionRegistrar(IClassFinder classFinder)
 {
     _classFinder = classFinder;
 }