예제 #1
0
 JsImplType(JsType jsType)
 {
     _JsType = jsType;
     _Name   = _JsType.name;
     if (EmptyTypes == null)
     {
         EmptyTypes = new JsImplType[0];
     }
 }
예제 #2
0
        private TypeOOPEmulationPhase CreateInitTypeCalls(JsType type)
        {
            bool generateCall = true;

            if (type is JsClass && MetadataUtils.IsJsGeneric(type.CSharpTypeDefinition, _metadataImporter))
            {
                generateCall = false;
            }
            if (string.IsNullOrEmpty(_metadataImporter.GetTypeSemantics(type.CSharpTypeDefinition).Name))
            {
                generateCall = false;
            }
            if (MetadataUtils.IsResources(type.CSharpTypeDefinition, _attributeStore))
            {
                generateCall = false;
            }
            if (MetadataUtils.IsMixin(type.CSharpTypeDefinition, _attributeStore))
            {
                generateCall = false;
            }

            var statements = new List <JsStatement>();

            if (generateCall)
            {
                string name        = _metadataImporter.GetTypeSemantics(type.CSharpTypeDefinition).Name;
                string typevarName = _namer.GetTypeVariableName(name);
                if (type.CSharpTypeDefinition.Kind == TypeKind.Enum)
                {
                    statements.Add(CreateInitEnumCall((JsEnum)type, typevarName));
                }
                else
                {
                    var c = (JsClass)type;
                    if (type.CSharpTypeDefinition.Kind == TypeKind.Interface)
                    {
                        statements.Add(CreateInitInterfaceCall(c, typevarName, GetImplementedInterfaces(type.CSharpTypeDefinition.GetDefinition()).ToList()));
                    }
                    else
                    {
                        statements.Add(CreateInitClassCall(c, typevarName, GetBaseClass(type.CSharpTypeDefinition), GetImplementedInterfaces(type.CSharpTypeDefinition).ToList()));
                        if (c.NamedConstructors.Count > 0)
                        {
                            statements.Add(AssignNamedConstructorPrototypes(c, JsExpression.Identifier(_namer.GetTypeVariableName(name))));
                        }
                        if (c.CSharpTypeDefinition.Kind == TypeKind.Struct)
                        {
                            statements.Add(JsExpression.Assign(JsExpression.Member(JsExpression.Identifier(_namer.GetTypeVariableName(name)), "__class"), JsExpression.False));
                        }
                    }
                }
            }

            return(new TypeOOPEmulationPhase(type.CSharpTypeDefinition.GetAllBaseTypeDefinitions().Where(t => !t.Equals(type.CSharpTypeDefinition)), statements));
        }
예제 #3
0
 public static JsImplType _TypeOf(JsType jsType)
 {
     if (jsType == null)
     {
         throw new Exception("Cannot resovle type");
     }
     if (jsType._ClrType == null)
     {
         jsType._ClrType = new JsImplType(jsType);
     }
     return(jsType._ClrType);
 }
예제 #4
0
        private TypeOOPEmulationPhase CreateMetadataAssignment(JsType type)
        {
            var metadata = GetMetadataDescriptor(type.CSharpTypeDefinition, false);

            if (metadata != null)
            {
                return(new TypeOOPEmulationPhase(null, new[] { (JsStatement)JsExpression.Invocation(JsExpression.Member(_systemScript, SetMetadata), JsExpression.Identifier(_namer.GetTypeVariableName(_metadataImporter.GetTypeSemantics(type.CSharpTypeDefinition).Name)), metadata) }));
            }
            else
            {
                return(null);
            }
        }
예제 #5
0
파일: Script.cs 프로젝트: next-pixel/Base
 /// <summary>
 /// Initializes a new instance of the <see cref="Script"/> class.
 /// </summary>
 /// <param name="url_">set url to load script.</param>
 /// <param name="position_">set position of script in the list of scripts included in the page.</param>
 /// <param name="jsType_">set if script is a js module.</param>
 public Script(string url_, int position_, JsType jsType_ = JsType.JsNormal)
 {
     Url        = url_;
     Position   = position_;
     JsIsModule = jsType_;
 }
예제 #6
0
 TypeOOPEmulation IOOPEmulator.EmulateType(JsType type)
 {
     return(EmulateType(type));
 }
예제 #7
0
 public TypeOOPEmulation EmulateType(JsType type)
 {
     return(new TypeOOPEmulation(new[] { CreateTypeDefinitions(type), CreateInitTypeCalls(type), CreateMetadataAssignment(type) }));
 }
예제 #8
0
        private TypeOOPEmulationPhase CreateTypeDefinitions(JsType type)
        {
            string name       = _metadataImporter.GetTypeSemantics(type.CSharpTypeDefinition).Name;
            bool   isGlobal   = string.IsNullOrEmpty(name);
            bool   isMixin    = MetadataUtils.IsMixin(type.CSharpTypeDefinition, _attributeStore);
            bool   export     = type.CSharpTypeDefinition.IsExternallyVisible();
            var    statements = new List <JsStatement>();

            statements.Add(JsStatement.Comment("//////////////////////////////////////////////////////////////////////////////" + Environment.NewLine + " " + type.CSharpTypeDefinition.FullName));

            string typevarName = _namer.GetTypeVariableName(name);

            if (type is JsClass)
            {
                var c = (JsClass)type;
                if (isGlobal)
                {
                    statements.AddRange(c.StaticMethods.Select(m => (JsStatement)JsExpression.Binary(ExpressionNodeType.Assign, JsExpression.Member(JsExpression.Identifier(GetRoot(type.CSharpTypeDefinition)), m.Name), m.Definition)));
                    export = false;
                }
                else if (isMixin)
                {
                    statements.AddRange(c.StaticMethods.Select(m => (JsStatement)JsExpression.Assign(MakeNestedMemberAccess(name + "." + m.Name), m.Definition)));
                    export = false;
                }
                else if (MetadataUtils.IsResources(c.CSharpTypeDefinition, _attributeStore))
                {
                    statements.Add(GenerateResourcesClass(c));
                }
                else
                {
                    var unnamedCtor = c.UnnamedConstructor ?? JsExpression.FunctionDefinition(new string[0], JsStatement.EmptyBlock);

                    if (MetadataUtils.IsJsGeneric(c.CSharpTypeDefinition, _metadataImporter))
                    {
                        var typeParameterNames = c.CSharpTypeDefinition.TypeParameters.Select(tp => _namer.GetTypeParameterName(tp)).ToList();
                        var stmts = new List <JsStatement> {
                            JsStatement.Var(InstantiatedGenericTypeVariableName, unnamedCtor)
                        };
                        AddClassMembers(c, InstantiatedGenericTypeVariableName, stmts);
                        stmts.AddRange(c.StaticInitStatements);
                        stmts.Add(JsStatement.Return(JsExpression.Identifier(InstantiatedGenericTypeVariableName)));
                        var replacer = new GenericSimplifier(c.CSharpTypeDefinition, typeParameterNames, JsExpression.Identifier(InstantiatedGenericTypeVariableName));
                        for (int i = 0; i < stmts.Count; i++)
                        {
                            stmts[i] = replacer.Process(stmts[i]);
                        }
                        statements.Add(JsStatement.Var(typevarName, JsExpression.FunctionDefinition(typeParameterNames, JsStatement.Block(stmts))));
                        statements.Add(JsExpression.Assign(JsExpression.Member(JsExpression.Identifier(typevarName), TypeName), JsExpression.String(_metadataImporter.GetTypeSemantics(c.CSharpTypeDefinition).Name)));
                        var args = new List <JsExpression> {
                            JsExpression.Identifier(typevarName), _linker.CurrentAssemblyExpression, JsExpression.Number(c.CSharpTypeDefinition.TypeParameterCount)
                        };
                        statements.Add(JsExpression.Invocation(JsExpression.Member(_systemScript, c.CSharpTypeDefinition.Kind == TypeKind.Interface ? InitGenericInterface : InitGenericClass), args));
                    }
                    else
                    {
                        statements.Add(JsStatement.Var(typevarName, unnamedCtor));
                        statements.Add(JsExpression.Assign(JsExpression.Member(JsExpression.Identifier(typevarName), TypeName), JsExpression.String(_metadataImporter.GetTypeSemantics(c.CSharpTypeDefinition).Name)));
                        AddClassMembers(c, typevarName, statements);
                    }
                }
            }
            else if (type is JsEnum)
            {
                var e = (JsEnum)type;
                statements.Add(JsStatement.Var(typevarName, JsExpression.FunctionDefinition(new string[0], JsStatement.EmptyBlock)));
                statements.Add(JsExpression.Assign(JsExpression.Member(JsExpression.Identifier(typevarName), TypeName), JsExpression.String(_metadataImporter.GetTypeSemantics(e.CSharpTypeDefinition).Name)));
            }

            if (export)
            {
                string root = GetRoot(type.CSharpTypeDefinition);
                statements.Add(JsExpression.Assign(MakeNestedMemberAccess(name, JsExpression.Identifier(root)), JsExpression.Identifier(typevarName)));
            }

            return(new TypeOOPEmulationPhase(null, statements));
        }
 public virtual TypeOOPEmulation EmulateType(JsType type)
 {
     return(_prev.EmulateType(type));
 }