Search code examples
javaandroidantapp-inventor

Cannot convert Java type to Yail type


I'm trying to build an extension for AppInventor, but when I execute ant extensions I get this error:

[javac] An annotation processor threw an uncaught exception.

[javac] Consult the following stack trace for details.

[javac] java.lang.RuntimeException: Cannot convert Java type 'android.content.Context' to Yail type


Full error log:

    [javac]
    [javac] An annotation processor threw an uncaught exception.
    [javac] Consult the following stack trace for details.
    [javac] java.lang.RuntimeException: Cannot convert Java type 'android.content.Context' to Yail type
    [javac]     at com.google.appinventor.components.scripts.ComponentProcessor.javaTypeToYailType(ComponentProcessor.ja
va:1184)
    [javac]     at com.google.appinventor.components.scripts.ComponentDescriptorGenerator.outputParameters(ComponentDesc
riptorGenerator.java:208)
    [javac]     at com.google.appinventor.components.scripts.ComponentDescriptorGenerator.outputBlockMethod(ComponentDes
criptorGenerator.java:187)
    [javac]     at com.google.appinventor.components.scripts.ComponentDescriptorGenerator.outputComponent(ComponentDescr
iptorGenerator.java:125)
    [javac]     at com.google.appinventor.components.scripts.ComponentDescriptorGenerator.outputResults(ComponentDescrip
torGenerator.java:226)
    [javac]     at com.google.appinventor.components.scripts.ComponentProcessor.process(ComponentProcessor.java:731)
    [javac]     at com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.ja
va:794)
    [javac]     at com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironm
ent.java:705)
    [javac]     at com.sun.tools.javac.processing.JavacProcessingEnvironment.access$1800(JavacProcessingEnvironment.java
:91)
    [javac]     at com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1
035)
    [javac]     at com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.jav
a:1176)
    [javac]     at com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1170)
    [javac]     at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:856)
    [javac]     at com.sun.tools.javac.main.Main.compile(Main.java:523)
    [javac]     at com.sun.tools.javac.main.Main.compile(Main.java:381)
    [javac]     at com.sun.tools.javac.main.Main.compile(Main.java:370)
    [javac]     at com.sun.tools.javac.main.Main.compile(Main.java:361)
    [javac]     at com.sun.tools.javac.Main.compile(Main.java:56)
    [javac]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    [javac]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    [javac]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    [javac]     at java.lang.reflect.Method.invoke(Method.java:498)
    [javac]     at org.apache.tools.ant.taskdefs.compilers.Javac13.execute(Javac13.java:58)
    [javac]     at org.apache.tools.ant.taskdefs.Javac.compile(Javac.java:1395)
    [javac]     at org.apache.tools.ant.taskdefs.Javac.execute(Javac.java:1121)
    [javac]     at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:293)
    [javac]     at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
    [javac]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    [javac]     at java.lang.reflect.Method.invoke(Method.java:498)
    [javac]     at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
    [javac]     at org.apache.tools.ant.Task.perform(Task.java:348)
    [javac]     at org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68)
    [javac]     at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:293)
    [javac]     at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
    [javac]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    [javac]     at java.lang.reflect.Method.invoke(Method.java:498)
    [javac]     at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
    [javac]     at org.apache.tools.ant.Task.perform(Task.java:348)
    [javac]     at org.apache.tools.ant.taskdefs.MacroInstance.execute(MacroInstance.java:402)
    [javac]     at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:293)
    [javac]     at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
    [javac]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    [javac]     at java.lang.reflect.Method.invoke(Method.java:498)
    [javac]     at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
    [javac]     at org.apache.tools.ant.Task.perform(Task.java:348)
    [javac]     at org.apache.tools.ant.Target.execute(Target.java:435)
    [javac]     at org.apache.tools.ant.Target.performTasks(Target.java:456)
    [javac]     at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1405)
    [javac]     at org.apache.tools.ant.helper.SingleCheckExecutor.executeTargets(SingleCheckExecutor.java:38)
    [javac]     at org.apache.tools.ant.Project.executeTargets(Project.java:1260)
    [javac]     at org.apache.tools.ant.taskdefs.Ant.execute(Ant.java:441)
    [javac]     at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:293)
    [javac]     at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
    [javac]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    [javac]     at java.lang.reflect.Method.invoke(Method.java:498)
    [javac]     at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
    [javac]     at org.apache.tools.ant.Task.perform(Task.java:348)
    [javac]     at org.apache.tools.ant.Target.execute(Target.java:435)
    [javac]     at org.apache.tools.ant.Target.performTasks(Target.java:456)
    [javac]     at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1405)
    [javac]     at org.apache.tools.ant.Project.executeTarget(Project.java:1376)
    [javac]     at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
    [javac]     at org.apache.tools.ant.Project.executeTargets(Project.java:1260)
    [javac]     at org.apache.tools.ant.Main.runBuild(Main.java:857)
    [javac]     at org.apache.tools.ant.Main.startAnt(Main.java:236)
    [javac]     at org.apache.tools.ant.launch.Launcher.run(Launcher.java:287)
    [javac]     at org.apache.tools.ant.launch.Launcher.main(Launcher.java:113)

BUILD FAILED
D:\appinventor-sources\appinventor\build.xml:37: The following error occurred while executing this line:
D:\appinventor-sources\appinventor\components\build.xml:343: The following error occurred while executing this line:
D:\appinventor-sources\appinventor\components\build.xml:230: Compile failed; see the compiler error output for details.

The file that is causing this error can be found here:

https://github.com/barreeeiroo/appinventor-sources/blob/master/appinventor/components/src/com/google/appinventor/components/runtime/VersionName.java

I think that the line is: import android.content.Context; on line 24

When I build the extension, there is no error on that file, like if it were an error while importing that library, because I tried import android.content.pm.Context but it crashes while reading the file, so I suppose that is a Javac or Java error


How can I fix that?


Solution

  • usually you get the context like this

    public class TaifunTools extends AndroidNonvisibleComponent {
      private static Context context;
      private static final String LOG_TAG = "TaifunTools";
    
      public TaifunTools(ComponentContainer container) {    
        super(container.$form());
        this.container = container;
        context = (Context) container.$context();
      }
    

    so later you would use this snippet to get the version name

      @SimpleFunction(description = "Returns the version name of the app")
      public String VersionName() {
        Log.d(LOG_TAG, "VersionName");
        try {
          PackageInfo pInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
          String version = pInfo.versionName;
          return version;
        } catch (NameNotFoundException e) {
          Log.e(LOG_TAG, e.getMessage());
          e.printStackTrace();
          return "";
        }
      }
    

    btw. for questions about working with the App Inventor sources, the best place is to ask in the App Inventor Open Source forum...

    see also the App Inventor Extensions document and look into the example extensions provided by MIT...