IntelliJ custom language plugin - Language ID is already registered error

Viewed 567

I am building a custom Javascript-Like custom language plugin. This custom language will be based on Ecmascript 6/Javascript. I want to add extra custom tags and keywords on top of Javascript. Most importantly, I want to make my code syntax highlighting look the same as Javascript together with auto-complete etc. I tested syntax highlighting with the Java Language and it worked.

Inside my MyScriptLanguage.java file I added this constructor and highlighting worked after debugging my plugin:

protected MyScriptLanguage() { super(JavaLanguage.INSTANCE, "MyScript", "text/ms", "application/ms"); }

Then I switched to the Javascript Language like this:
protected MyScriptLanguage() { super(JavascriptLanguage.INSTANCE, "MyScript", "text/ms", "application/ms"); }

After switching on to Javascript debug stopped working with some language conflict errors (Language with ID 'JavaScript' is already registered: class com.intellij.lang.javascript.JavascriptLanguage) below:

 2017-11-14 08:57:56,531 [  12556]  ERROR - llij.ide.plugins.PluginManager - com.intellij.ide.plugins.PluginManager$StartupAbortedException: Fatal error initializing plugin com.ndoubismarck.mytest
java.lang.RuntimeException: com.intellij.ide.plugins.PluginManager$StartupAbortedException: Fatal error initializing plugin com.ndoubismarck.mytest
    at com.intellij.idea.IdeaApplication.run(IdeaApplication.java:210)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.idea.MainImpl$1$1.a(MainImpl.java:64)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
    at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:345)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
Caused by: com.intellij.ide.plugins.PluginManager$StartupAbortedException: Fatal error initializing plugin com.ndoubismarck.mytest
    at com.intellij.ide.plugins.PluginManager.handleComponentError(PluginManager.java:272)
    at com.intellij.openapi.fileTypes.impl.FileTypeManagerImpl.initStandardFileTypes(FileTypeManagerImpl.java:310)
    at com.intellij.openapi.fileTypes.impl.FileTypeManagerImpl.<init>(FileTypeManagerImpl.java:267)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at org.picocontainer.defaults.InstantiatingComponentAdapter.newInstance(InstantiatingComponentAdapter.java:193)
    at com.intellij.util.pico.CachingConstructorInjectionComponentAdapter.doGetComponentInstance(CachingConstructorInjectionComponentAdapter.java:103)
    at com.intellij.util.pico.CachingConstructorInjectionComponentAdapter.instantiateGuarded(CachingConstructorInjectionComponentAdapter.java:80)
    at com.intellij.util.pico.CachingConstructorInjectionComponentAdapter.getComponentInstance(CachingConstructorInjectionComponentAdapter.java:63)
    at com.intellij.openapi.components.impl.ComponentManagerImpl$ComponentConfigComponentAdapter.getComponentInstance(ComponentManagerImpl.java:469)
    at com.intellij.openapi.components.impl.ComponentManagerImpl.createComponents(ComponentManagerImpl.java:118)
    at com.intellij.openapi.application.impl.ApplicationImpl.a(ApplicationImpl.java:462)
    at com.intellij.openapi.progress.impl.CoreProgressManager.a(CoreProgressManager.java:170)
    at com.intellij.openapi.progress.impl.CoreProgressManager.a(CoreProgressManager.java:548)
    at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:493)
    at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:94)
    at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:157)
    at com.intellij.openapi.application.impl.ApplicationImpl.createComponents(ApplicationImpl.java:469)
    at com.intellij.openapi.components.impl.ComponentManagerImpl.init(ComponentManagerImpl.java:102)
    at com.intellij.openapi.application.impl.ApplicationImpl.load(ApplicationImpl.java:421)
    at com.intellij.openapi.application.impl.ApplicationImpl.load(ApplicationImpl.java:407)
    at com.intellij.idea.IdeaApplication.run(IdeaApplication.java:203)
    ... 20 more
Caused by: com.intellij.diagnostic.PluginException:  [Plugin: com.ndoubismarck.mytest]
    ... 44 more
Caused by: java.lang.ExceptionInInitializerError
    at com.ndoubismarck.mytest.lang.myscript.MyScriptLanguage.<init>(MyScriptLanguage.java:12)
    at com.ndoubismarck.mytest.lang.myscript.MyScriptLanguage.<clinit>(MyScriptLanguage.java:7)
    at com.ndoubismarck.mytest.lang.myscript.MyScriptFileType.<init>(MyScriptFileType.java:12)
    at com.ndoubismarck.mytest.lang.myscript.MyScriptFileType.<clinit>(MyScriptFileType.java:9)
    at com.ndoubismarck.mytest.lang.myscript.MyScriptFileTypeFactory.createFileTypes(MyScriptFileTypeFactory.java:10)
    at com.intellij.openapi.fileTypes.impl.FileTypeManagerImpl.initStandardFileTypes(FileTypeManagerImpl.java:307)
    ... 42 more
Caused by: com.intellij.diagnostic.ImplementationConflictException: Language with ID 'JavaScript' is already registered: class com.intellij.lang.javascript.JavascriptLanguage
    at com.intellij.lang.Language.<init>(Language.java:89)
    at com.intellij.lang.Language.<init>(Language.java:73)
    at com.intellij.lang.javascript.JavascriptLanguage.<init>(JavascriptLanguage.java:26)
    at com.intellij.lang.javascript.JavascriptLanguage.<clinit>(JavascriptLanguage.java:23)
    ... 48 more
2017-11-14 08:57:56,538 [  12563]  ERROR - llij.ide.plugins.PluginManager - IntelliJ IDEA 2017.2.5  Build #IU-172.4343.14
2017-11-14 08:57:56,538 [  12563]  ERROR - llij.ide.plugins.PluginManager - JDK: 1.8.0_111
2017-11-14 08:57:56,538 [  12563]  ERROR - llij.ide.plugins.PluginManager - VM: Java HotSpot(TM) 64-Bit Server VM
2017-11-14 08:57:56,539 [  12564]  ERROR - llij.ide.plugins.PluginManager - Vendor: Oracle Corporation
2017-11-14 08:57:56,539 [  12564]  ERROR - llij.ide.plugins.PluginManager - OS: Mac OS X

1. plugin.xml

<idea-plugin>
    <id>com.ndoubismarck.mytest</id>
    <name>My Custom Language</name>
    <version>1.0</version>
    <vendor email="support@yourcompany.com" url="http://www.yourcompany.com">YourCompany</vendor>

    <description><![CDATA[
      My custom language which is extending Javascript, HTML and CSS.<br>
      <em>Javascript, HTML, CSS</em>
    ]]></description>

    <change-notes><![CDATA[
      <br>
      <em></em>
    ]]>
    </change-notes>

    <!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/build_number_ranges.html for description -->
    <idea-version since-build="145.0"/>

    <!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html
         on how to target different products -->
    <!-- uncomment to enable plugin in all products
    <depends>com.intellij.modules.lang</depends>
    -->

    <extensions defaultExtensionNs="com.intellij">
        <!-- Add your extensions here -->
        <fileTypeFactory implementation="com.ndoubismarck.mytest.lang.myscript.MyScriptFileTypeFactory"/>
    </extensions>

    <actions>
        <!-- Add your actions here -->
    </actions>

</idea-plugin>



2. MyScriptFileTypeFactory.java

package com.ndoubismarck.mytest.lang.myscript;

import com.intellij.openapi.fileTypes.FileTypeConsumer;
import com.intellij.openapi.fileTypes.FileTypeFactory;
import org.jetbrains.annotations.NotNull;

public class MyScriptFileTypeFactory extends FileTypeFactory {
    @Override
    public void createFileTypes(@NotNull FileTypeConsumer fileTypeConsumer) {
        fileTypeConsumer.consume(MyScriptFileType.INSTANCE, "ms");
    }
}



3. MyScriptFileType.java

package com.ndoubismarck.mytest.lang.myscript;

import com.intellij.lang.Language;
import com.intellij.lang.javascript.JavascriptLanguage;

public class MyScriptLanguage extends Language {
public static final MyScriptLanguage INSTANCE = new MyScriptLanguage();

protected MyScriptLanguage() {
    //super(JavaLanguage.INSTANCE, "MyScript", "text/ms", "application/ms");
    super(JavascriptLanguage.INSTANCE, "MyScript", "text/ms", "application/ms");
}

@Override
public String getDisplayName() {
    return "MyScript language";
}
}

Can someone help me out. I just need to extend the Javascript highlighting and Autocomplete functions on top of my own custom ones.

1 Answers

This may be happening due to missing dependency on JavaScript plugin in your plugin.xml. Please try adding

<depends>JavaScript</depends> after vendor tag

Related