Bladeren bron

Add support for static functions to JSBind. (Typescript only)

Matt Benic 10 jaren geleden
bovenliggende
commit
9e43034147

+ 50 - 7
Source/ToolCore/JSBind/JSBClassWriter.cpp

@@ -53,7 +53,20 @@ void JSBClassWriter::GenerateSource(String& sourceOut)
 
     source.AppendWithFormat("static void jsb_class_define_%s(JSVM* vm)\n{\n", klass_->GetName().CString());
     source.Append("duk_context* ctx = vm->GetJSContext();\n");
-    source.AppendWithFormat("js_class_get_prototype(ctx, \"%s\", \"%s\");\n", packageName.CString(), klass_->GetName().CString());
+
+    GenerateStaticFunctionsSource(source, packageName);
+
+    GenerateNonStaticFunctionsSource(source, packageName);
+
+    source.Append("}\n");
+
+    sourceOut += source;
+
+}
+
+void JSBClassWriter::GenerateStaticFunctionsSource(String& source, String& packageName)
+{
+    source.AppendWithFormat("js_class_get_constructor(ctx, \"%s\", \"%s\");\n", packageName.CString(), klass_->GetName().CString());
 
     for (unsigned i = 0; i < klass_->functions_.Size(); i++)
     {
@@ -65,27 +78,57 @@ void JSBClassWriter::GenerateSource(String& sourceOut)
         if (function->IsConstructor() || function->IsDestructor())
             continue;
 
+        if (!function->IsStatic())
+            continue;
+
         if (function->FirstDefaultParameter() != -1)
         {
             source.AppendWithFormat("duk_push_c_function(ctx, jsb_class_%s_%s, DUK_VARARGS);\n", klass_->GetName().CString(), function->GetName().CString());
         }
         else
         {
-            source.AppendWithFormat("duk_push_c_function(ctx, jsb_class_%s_%s, %i);\n", klass_->GetName().CString(), function->GetName().CString(), (int) function->GetParameters().Size());
+            source.AppendWithFormat("duk_push_c_function(ctx, jsb_class_%s_%s, %i);\n", klass_->GetName().CString(), function->GetName().CString(), (int)function->GetParameters().Size());
         }
 
-        String scriptName =  function->GetName();
+        String scriptName = function->GetName();
         scriptName[0] = tolower(scriptName[0]);
         source.AppendWithFormat("duk_put_prop_string(ctx, -2, \"%s\");\n", scriptName.CString());
-
     }
-
     source.Append("duk_pop(ctx);\n");
-    source.Append("}\n");
+}
 
+void JSBClassWriter::GenerateNonStaticFunctionsSource(String& source, String& packageName)
+{
+    source.AppendWithFormat("js_class_get_prototype(ctx, \"%s\", \"%s\");\n", packageName.CString(), klass_->GetName().CString());
 
-    sourceOut += source;
+    for (unsigned i = 0; i < klass_->functions_.Size(); i++)
+    {
+        JSBFunction* function = klass_->functions_.At(i);
+
+        if (function->Skip())
+            continue;
+
+        if (function->IsConstructor() || function->IsDestructor())
+            continue;
+
+        if (function->IsStatic())
+            continue;
+
+        if (function->FirstDefaultParameter() != -1)
+        {
+            source.AppendWithFormat("duk_push_c_function(ctx, jsb_class_%s_%s, DUK_VARARGS);\n", klass_->GetName().CString(), function->GetName().CString());
+        }
+        else
+        {
+            source.AppendWithFormat("duk_push_c_function(ctx, jsb_class_%s_%s, %i);\n", klass_->GetName().CString(), function->GetName().CString(), (int)function->GetParameters().Size());
+        }
 
+        String scriptName = function->GetName();
+        scriptName[0] = tolower(scriptName[0]);
+        source.AppendWithFormat("duk_put_prop_string(ctx, -2, \"%s\");\n", scriptName.CString());
+
+    }
+    source.Append("duk_pop(ctx);\n");
 }
 
 }

+ 2 - 0
Source/ToolCore/JSBind/JSBClassWriter.h

@@ -22,6 +22,8 @@ public:
 private:
 
     void WriteFunctions(String& source);
+    void GenerateStaticFunctionsSource(String& source, String& packageName);
+    void GenerateNonStaticFunctionsSource(String& source, String& packageName);
 
     JSBClass* klass_;
 

+ 5 - 1
Source/ToolCore/JSBind/JSBFunction.h

@@ -84,7 +84,8 @@ public:
     JSBFunction(JSBClass* klass) : class_(klass), returnType_(0),
                                    isConstructor_(false), isDestructor_(false),
                                    isGetter_(false), isSetter_(false),
-                                   isOverload_(false), skip_(false), isVirtual_(false)
+                                   isOverload_(false), skip_(false), 
+                                   isVirtual_(false), isStatic_(false)
     {
 
     }
@@ -97,6 +98,7 @@ public:
     bool IsGetter() { return isGetter_; }
     bool IsOverload() { return isOverload_; }
     bool IsVirtual() { return isVirtual_; }
+    bool IsStatic() { return isStatic_; }
     bool Skip() { return skip_; }
 
     JSBClass* GetClass() { return class_; }
@@ -113,6 +115,7 @@ public:
     void SetGetter(bool value = true) { isGetter_ = value; }
     void SetOverload(bool value = true) { isOverload_ = value; }
     void SetVirtual(bool value = true) { isVirtual_ = value; }
+    void SetStatic(bool value = true) { isStatic_ = value; }
     void SetSkip(bool value) { skip_ = value; }
     void SetReturnType(JSBFunctionType* retType) { returnType_ = retType; }
     void SetDocString(const String& docString) { docString_ = docString; }
@@ -184,6 +187,7 @@ private:
     bool isSetter_;
     bool isOverload_;
     bool isVirtual_;
+    bool isStatic_;
     bool skip_;
 
 };

+ 13 - 3
Source/ToolCore/JSBind/JSBFunctionWriter.cpp

@@ -375,8 +375,11 @@ void JSBFunctionWriter::WriteFunction(String& source)
 
     WriteParameterMarshal(source);
 
-    source.Append("duk_push_this(ctx);\n");
-    source.AppendWithFormat("%s* native = js_to_class_instance<%s>(ctx, -1, 0);\n", klass->GetNativeName().CString(), klass->GetNativeName().CString());
+    if (!function_->IsStatic())
+    {
+        source.Append("duk_push_this(ctx);\n");
+        source.AppendWithFormat("%s* native = js_to_class_instance<%s>(ctx, -1, 0);\n", klass->GetNativeName().CString(), klass->GetNativeName().CString());
+    }
 
     // declare return value;
     bool returnDeclared = false;
@@ -446,7 +449,14 @@ void JSBFunctionWriter::WriteFunction(String& source)
 
     }
 
-    source.AppendWithFormat("native->%s(", function_->name_.CString());
+    if (function_->IsStatic())
+    {
+        source.AppendWithFormat("%s::%s(", klass->GetNativeName().CString(), function_->name_.CString());
+    }
+    else
+    {
+        source.AppendWithFormat("native->%s(", function_->name_.CString());
+    }
 
     Vector<JSBFunctionType*>& parameters = function_->GetParameters();
 

+ 3 - 0
Source/ToolCore/JSBind/JSBHeaderVisitor.h

@@ -272,6 +272,9 @@ public:
         if (function->isOverride())
             jfunction->SetVirtual(true);
 
+        if (function->isStatic())
+            jfunction->SetStatic(true);
+
         // see if we support return type
         if (function->hasReturnType() && !function->returnType().type()->isVoidType())
         {

+ 6 - 1
Source/ToolCore/JSBind/JSBTypeScript.cpp

@@ -93,7 +93,12 @@ void JSBTypeScript::ExportFunction(JSBFunction* function)
     if (function->GetDocString().Length())
         source_ += "      //" + function->GetDocString() + "\n";
 
-    source_ += "      " + scriptName + "(";
+    source_ += "      ";
+
+    if (function->IsStatic())
+        source_ += "static ";
+
+    source_ += scriptName + "(";
 
     Vector<JSBFunctionType*>& parameters = function->GetParameters();