diff --git a/src/main/java/com/intellij/plugins/haxe/haxelib/HaxeSdkFinder.java b/src/main/java/com/intellij/plugins/haxe/haxelib/HaxeSdkFinder.java new file mode 100644 index 000000000..aacf0b95d --- /dev/null +++ b/src/main/java/com/intellij/plugins/haxe/haxelib/HaxeSdkFinder.java @@ -0,0 +1,40 @@ +/* + * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2014-2014 AS3Boyan + * Copyright 2014-2014 Elias Ku + * Copyright 2017 Eric Bishton + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.plugins.haxe.haxelib; + +import com.intellij.openapi.projectRoots.ProjectJdkTable; +import com.intellij.openapi.projectRoots.Sdk; +import com.intellij.openapi.roots.impl.SdkFinder; +import com.intellij.plugins.haxe.config.sdk.HaxeSdkType; +import lombok.CustomLog; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +@CustomLog +public class HaxeSdkFinder extends SdkFinder { + + @Override + public @Nullable Sdk findSdk(@NotNull String name, @NotNull String sdkType) { + if (HaxeSdkType.getInstance().getName().equals(sdkType)) { + return ProjectJdkTable.getInstance().findJdk(name, sdkType); + } + + return null; + } +} diff --git a/src/main/java/com/intellij/plugins/haxe/haxelib/HaxelibCommandUtils.java b/src/main/java/com/intellij/plugins/haxe/haxelib/HaxelibCommandUtils.java index 0211ab64e..603504a61 100644 --- a/src/main/java/com/intellij/plugins/haxe/haxelib/HaxelibCommandUtils.java +++ b/src/main/java/com/intellij/plugins/haxe/haxelib/HaxelibCommandUtils.java @@ -108,9 +108,13 @@ public static List issueHaxelibCommand(@NotNull Sdk sdk, String ... args return Collections.EMPTY_LIST; } + // TODO mlo: try to clean up code so it only uses either dir or file File haxelibCmd = new File(haxelibPath); - VirtualFile dir = haxelibCmd.isFile() ? LocalFileSystem.getInstance().findFileByPath(haxelibCmd.getParent()) : null; - + VirtualFile dir = haxelibCmd.isFile() ? LocalFileSystem.getInstance().findFileByPath(haxelibCmd.getParent()) : LocalFileSystem.getInstance().findFileByPath(haxelibPath); + if(dir == null) { + log.error("unable to execute haxelib command, haxelib path is null"); + return List.of(); + } List stdout = new ArrayList(); int exitvalue = HaxeProcessUtil.runProcess(commandLineArguments, true, dir, sdkData, stdout, null, null, false); diff --git a/src/main/java/com/intellij/plugins/haxe/ide/HXMLHaxelibCompletionContributor.java b/src/main/java/com/intellij/plugins/haxe/ide/HXMLHaxelibCompletionContributor.java index 26fb45745..561a50d8f 100644 --- a/src/main/java/com/intellij/plugins/haxe/ide/HXMLHaxelibCompletionContributor.java +++ b/src/main/java/com/intellij/plugins/haxe/ide/HXMLHaxelibCompletionContributor.java @@ -19,7 +19,6 @@ import com.intellij.codeInsight.completion.*; import com.intellij.codeInsight.lookup.LookupElementBuilder; -import com.intellij.openapi.progress.ProgressManager; import com.intellij.patterns.PlatformPatterns; import com.intellij.plugins.haxe.buildsystem.hxml.HXMLLanguage; import com.intellij.plugins.haxe.haxelib.HaxelibCache; @@ -27,8 +26,10 @@ import com.intellij.plugins.haxe.hxml.psi.HXMLTypes; import com.intellij.plugins.haxe.hxml.psi.HXMLValue; import com.intellij.util.ProcessingContext; +import lombok.CustomLog; import org.jetbrains.annotations.NotNull; +import java.util.Collections; import java.util.List; import static com.intellij.patterns.PlatformPatterns.psiElement; @@ -36,15 +37,13 @@ /** * Created by as3boyan on 15.11.14. */ +@CustomLog public class HXMLHaxelibCompletionContributor extends CompletionContributor { - protected static List availableHaxelibs = null; - protected static List localHaxelibs = null; - - private HaxelibCache haxelibCache; + protected static List availableHaxelibs = Collections.emptyList(); + protected static List localHaxelibs = Collections.emptyList(); public HXMLHaxelibCompletionContributor() { - ProgressManager.getInstance().runProcessWithProgressSynchronously(() -> haxelibCache = HaxelibCache.getInstance(), "Fetching haxelib list", false, null); // intelliJ 2018 and older extend(CompletionType.BASIC, psiElement(HXMLTypes.VALUE).withParent(HXMLLib.class).withLanguage(HXMLLanguage.INSTANCE), getProvider()); @@ -75,8 +74,8 @@ protected void addCompletions(@NotNull CompletionParameters parameters, } private void getLatestFromCache() { - availableHaxelibs = haxelibCache.getAvailableHaxelibs(); - localHaxelibs = haxelibCache.getLocalHaxelibs(); + availableHaxelibs = HaxelibCache.getInstance().getAvailableHaxelibs(); + localHaxelibs = HaxelibCache.getInstance().getLocalHaxelibs(); } }; } diff --git a/src/main/java/com/intellij/plugins/haxe/ide/projectStructure/HaxeProjectImportBuilder.java b/src/main/java/com/intellij/plugins/haxe/ide/projectStructure/HaxeProjectImportBuilder.java new file mode 100644 index 000000000..7f628bdf8 --- /dev/null +++ b/src/main/java/com/intellij/plugins/haxe/ide/projectStructure/HaxeProjectImportBuilder.java @@ -0,0 +1,112 @@ +package com.intellij.plugins.haxe.ide.projectStructure; + +import com.intellij.ide.highlighter.ModuleFileType; +import com.intellij.ide.util.projectWizard.ModuleBuilder; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.module.ModifiableModuleModel; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModuleManager; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.projectRoots.ProjectJdkTable; +import com.intellij.openapi.projectRoots.Sdk; +import com.intellij.openapi.roots.ContentEntry; +import com.intellij.openapi.roots.ModifiableRootModel; +import com.intellij.openapi.roots.ModuleRootManager; +import com.intellij.openapi.roots.impl.ModifiableModelCommitter; +import com.intellij.openapi.roots.ui.configuration.ModulesProvider; +import com.intellij.openapi.vfs.LocalFileSystem; +import com.intellij.packaging.artifacts.ModifiableArtifactModel; +import com.intellij.plugins.haxe.HaxeBundle; +import com.intellij.plugins.haxe.config.HaxeConfiguration; +import com.intellij.plugins.haxe.config.sdk.HaxeSdkType; +import com.intellij.plugins.haxe.ide.module.HaxeModuleSettings; +import com.intellij.plugins.haxe.ide.module.HaxeModuleType; +import com.intellij.plugins.haxe.ide.projectStructure.detection.HaxeProjectData; +import com.intellij.projectImport.ProjectImportBuilder; +import icons.HaxeIcons; +import org.jetbrains.annotations.Nls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class HaxeProjectImportBuilder extends ProjectImportBuilder { + + @Override + public @NotNull @Nls(capitalization = Nls.Capitalization.Sentence) String getName() { + return HaxeBundle.message("haxe.project"); + } + + + @Override + public Icon getIcon() { + return HaxeIcons.HAXE_LOGO; + } + + @Override + public boolean isMarked(Object element) { + return true; + } + + @Override + public void setOpenProjectSettingsAfter(boolean on) { + + } + + + @Override + public @Nullable List commit(Project project, + ModifiableModuleModel model, + ModulesProvider modulesProvider, + ModifiableArtifactModel artifactModel) { + final ModifiableModuleModel moduleModel = model != null ? model : ModuleManager.getInstance(project).getModifiableModel(); + + + final Map moduleToModifiableModelMap = new HashMap<>(); + + final HaxeProjectData haxeProjectData = new HaxeProjectData(getFileToImport()); + final String moduleName = haxeProjectData.getName(); + + final String moduleFilePath = haxeProjectData.getProjectRootPath() + "/" + moduleName + ModuleFileType.DOT_DEFAULT_EXTENSION; + final Module module = moduleModel.newModule(moduleFilePath, HaxeModuleType.getInstance().getId()); + + if (LocalFileSystem.getInstance().findFileByPath(moduleFilePath) != null) { + ApplicationManager.getApplication().runWriteAction(() -> ModuleBuilder.deleteModuleFile(moduleFilePath)); + } + + final ModifiableRootModel rootModel = ModuleRootManager.getInstance(module).getModifiableModel(); + final HaxeModuleSettings instance = HaxeModuleSettings.getInstance(module); + + configureProjectSettings(haxeProjectData, instance); + configureContentRoots(haxeProjectData, rootModel); + moduleToModifiableModelMap.put(module, rootModel); + + final Sdk mostRecentSdk = ProjectJdkTable.getInstance().findMostRecentSdkOfType(HaxeSdkType.getInstance()); + rootModel.setSdk(mostRecentSdk); + + ApplicationManager.getApplication() + .runWriteAction(() -> ModifiableModelCommitter.multiCommit(moduleToModifiableModelMap.values(), moduleModel)); + + + return List.of(module); + } + + private static void configureProjectSettings(HaxeProjectData haxeProjectData, HaxeModuleSettings instance) { + HaxeConfiguration type = haxeProjectData.getProjectType(); + instance.setOutputFolder(haxeProjectData.getOutputFolder()); + instance.setBuildConfig(type.asBuildConfigValue()); + switch (type) { + case OPENFL -> instance.setOpenFLPath(haxeProjectData.getProjectFilePath()); + case HXML -> instance.setHxmlPath(haxeProjectData.getProjectFilePath()); + case NMML -> instance.setNmmlPath(haxeProjectData.getProjectFilePath()); + } + } + + private static void configureContentRoots(HaxeProjectData haxeProjectData, ModifiableRootModel rootModel) { + ContentEntry contentRoot = rootModel.addContentEntry(haxeProjectData.getProjectRoot()); + haxeProjectData.getSourcePaths().forEach(source -> contentRoot.addSourceFolder(source, false)); + } +} diff --git a/src/main/java/com/intellij/plugins/haxe/ide/projectStructure/detection/HaxeProjectData.java b/src/main/java/com/intellij/plugins/haxe/ide/projectStructure/detection/HaxeProjectData.java new file mode 100644 index 000000000..c66b346b7 --- /dev/null +++ b/src/main/java/com/intellij/plugins/haxe/ide/projectStructure/detection/HaxeProjectData.java @@ -0,0 +1,69 @@ +package com.intellij.plugins.haxe.ide.projectStructure.detection; + +import com.intellij.openapi.vfs.VfsUtil; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.plugins.haxe.config.HaxeConfiguration; + +import java.io.File; +import java.nio.file.Path; +import java.util.List; +import java.util.Objects; + +public class HaxeProjectData { + + private String projectFile; + + public HaxeProjectData(String projectFile) { + this.projectFile = projectFile; + } + + public String getName() { + return getProjectRoot().getName(); + } + + public String getProjectRootPath() { + return new File(projectFile).getParent(); + } + + public VirtualFile getProjectRoot() { + return VfsUtil.findFile(Path.of(getProjectRootPath()), true); + } + public VirtualFile getProjectFile() { + return VfsUtil.findFile(Path.of(getProjectFilePath()), true); + } + + public List getSourcePaths() { + VirtualFile root = getProjectRoot(); + VirtualFile projectFile = VfsUtil.findFile(Path.of(getProjectFilePath()), true); + + List paths = HaxeProjectFileDetectionUtil.sourcePaths(projectFile); + return paths.stream().map(root::findChild).filter(Objects::nonNull).toList(); + + } + + public HaxeConfiguration getProjectType() { + VirtualFile file = getProjectFile(); + if (HaxeProjectFileDetectionUtil.isLimeProject(file) + || HaxeProjectFileDetectionUtil.isOpenFLProject(file)) { + return HaxeConfiguration.OPENFL; + } + if (HaxeProjectFileDetectionUtil.isHxmlProject(file)) { + return HaxeConfiguration.HXML; + } + if (HaxeProjectFileDetectionUtil.isNMMLProject(file)) { + return HaxeConfiguration.NMML; + } + + return HaxeConfiguration.CUSTOM; + } + + public String getProjectFilePath() { + return projectFile; + } + + public String getOutputFolder() { + String path = getProjectRootPath(); + assert path.length() > 0; + return path + "/out"; + } +} diff --git a/src/main/java/com/intellij/plugins/haxe/ide/projectStructure/detection/HaxeProjectFileDetectionUtil.java b/src/main/java/com/intellij/plugins/haxe/ide/projectStructure/detection/HaxeProjectFileDetectionUtil.java new file mode 100644 index 000000000..fc31f481f --- /dev/null +++ b/src/main/java/com/intellij/plugins/haxe/ide/projectStructure/detection/HaxeProjectFileDetectionUtil.java @@ -0,0 +1,133 @@ +package com.intellij.plugins.haxe.ide.projectStructure.detection; + +import com.intellij.openapi.vfs.VfsUtil; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.util.xml.NanoXmlUtil; +import lombok.CustomLog; +import lombok.experimental.UtilityClass; +import org.jetbrains.annotations.Nullable; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +@CustomLog +@UtilityClass +public class HaxeProjectFileDetectionUtil { + + public boolean isOpenFLProject(VirtualFile file) { + if (file.isDirectory()) return false; + if (fileExtensionIs(file, "xml")) { + return guessProjectType(file) == XmlProjectType.OPENFL; + } + return false; + } + + public boolean isLimeProject(VirtualFile file) { + if (file.isDirectory()) return false; + if (fileExtensionIs(file, "xml")) { + return guessProjectType(file) == XmlProjectType.LIME; + } + return false; + } + + public boolean isHxmlProject(VirtualFile file) { + if (file.isDirectory()) return false; + return fileExtensionIs(file, "hxml"); + } + + public boolean isNMMLProject(VirtualFile file) { + if (file.isDirectory()) return false; + // nmml files looks like lime but has different file extension + if (fileExtensionIs(file, "nmml")) { + return guessProjectType(file) == XmlProjectType.LIME; + } + return false; + } + + private XmlProjectType guessProjectType(VirtualFile file) { + + try { + byte[] data = VfsUtil.loadBytes(file); + HaxeXmlProjectParser builder = new HaxeXmlProjectParser(); + NanoXmlUtil.parse(new ByteArrayInputStream(data), builder); + return builder.getProjectType(); + } catch (IOException e) { + log.warn("Unable to read content of file"); + return XmlProjectType.UNKNOWN; + } + + + } + + public static List sourcePaths(VirtualFile file) { + + try { + byte[] data = VfsUtil.loadBytes(file); + HaxeXmlProjectParser builder = new HaxeXmlProjectParser(); + NanoXmlUtil.parse(new ByteArrayInputStream(data), builder); + return builder.getSources(); + } + catch (IOException e) { + log.warn("Unable to read content of file"); + return List.of(); + } + } + + private enum XmlProjectType { + OPENFL, + LIME, + UNKNOWN + } + + private static class HaxeXmlProjectParser extends NanoXmlUtil.BaseXmlBuilder { + String currentElement = null; + boolean hasOpenFlLib = false; + boolean hasProjectTag = false; + + List sources = new ArrayList<>(); + + @Override + public void addAttribute(String key, @Nullable String nsPrefix, @Nullable String nsSystemID, String value, String type) throws Exception { + super.addAttribute(key, nsPrefix, nsSystemID, value, type); + if (this.currentElement.equals("haxelib")) { + if (key.equalsIgnoreCase("name") && value.equalsIgnoreCase("openfl")) { + hasOpenFlLib = true; + } + } + if (this.currentElement.equals("source")) { + if (key.equalsIgnoreCase("path")) { + sources.add(value); + } + } + } + + @Override + public void startElement(String name, @Nullable String nsPrefix, @Nullable String nsSystemID, String systemID, int lineNr) throws Exception { + super.startElement(name, nsPrefix, nsSystemID, systemID, lineNr); + currentElement = name; + if (name.equalsIgnoreCase("project")) { + hasProjectTag = true; + } + } + + public XmlProjectType getProjectType() { + if (hasProjectTag && hasOpenFlLib) return XmlProjectType.OPENFL; + if (hasProjectTag) return XmlProjectType.LIME; + return XmlProjectType.UNKNOWN; + } + + public List getSources() { + return sources; + } + + } + + private static boolean fileExtensionIs(VirtualFile file, String ext) { + return Optional.ofNullable(file.getExtension()) + .map(s -> s.equalsIgnoreCase(ext)) + .orElse(false); + } +} \ No newline at end of file diff --git a/src/main/java/com/intellij/plugins/haxe/ide/projectStructure/processor/HaxeOpenHxmlProjectProcessor.java b/src/main/java/com/intellij/plugins/haxe/ide/projectStructure/processor/HaxeOpenHxmlProjectProcessor.java new file mode 100644 index 000000000..53c661239 --- /dev/null +++ b/src/main/java/com/intellij/plugins/haxe/ide/projectStructure/processor/HaxeOpenHxmlProjectProcessor.java @@ -0,0 +1,28 @@ +package com.intellij.plugins.haxe.ide.projectStructure.processor; + +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.plugins.haxe.ide.projectStructure.detection.HaxeProjectFileDetectionUtil; +import icons.HaxeIcons; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; + +public class HaxeOpenHxmlProjectProcessor extends HaxeProjectProcessor { + @NotNull + @Override + public String[] getSupportedExtensions() { + return new String[]{"hxml"}; + } + + @Nullable + @Override + public Icon getIcon() { + return HaxeIcons.HAXE_LOGO; + } + + @Override + public boolean canOpenProject(@NotNull VirtualFile file) { + return HaxeProjectFileDetectionUtil.isHxmlProject(file); + } +} diff --git a/src/main/java/com/intellij/plugins/haxe/ide/projectStructure/processor/HaxeOpenLimeProjectProcessor.java b/src/main/java/com/intellij/plugins/haxe/ide/projectStructure/processor/HaxeOpenLimeProjectProcessor.java new file mode 100644 index 000000000..00856257c --- /dev/null +++ b/src/main/java/com/intellij/plugins/haxe/ide/projectStructure/processor/HaxeOpenLimeProjectProcessor.java @@ -0,0 +1,28 @@ +package com.intellij.plugins.haxe.ide.projectStructure.processor; + +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.plugins.haxe.ide.projectStructure.detection.HaxeProjectFileDetectionUtil; +import icons.HaxeIcons; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; + +public class HaxeOpenLimeProjectProcessor extends HaxeProjectProcessor { + @NotNull + @Override + public String[] getSupportedExtensions() { + return new String[]{"xml"}; + } + + @Nullable + @Override + public Icon getIcon() { + return HaxeIcons.LIME_LOGO; + } + + @Override + public boolean canOpenProject(@NotNull VirtualFile file) { + return HaxeProjectFileDetectionUtil.isLimeProject(file); + } +} diff --git a/src/main/java/com/intellij/plugins/haxe/ide/projectStructure/processor/HaxeOpenNMEProjectProcessor.java b/src/main/java/com/intellij/plugins/haxe/ide/projectStructure/processor/HaxeOpenNMEProjectProcessor.java new file mode 100644 index 000000000..064572fcd --- /dev/null +++ b/src/main/java/com/intellij/plugins/haxe/ide/projectStructure/processor/HaxeOpenNMEProjectProcessor.java @@ -0,0 +1,28 @@ +package com.intellij.plugins.haxe.ide.projectStructure.processor; + +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.plugins.haxe.ide.projectStructure.detection.HaxeProjectFileDetectionUtil; +import icons.HaxeIcons; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; + +public class HaxeOpenNMEProjectProcessor extends HaxeProjectProcessor { + @NotNull + @Override + public String[] getSupportedExtensions() { + return new String[]{"nmml"}; + } + + @Nullable + @Override + public Icon getIcon() { + return HaxeIcons.NMML_LOGO; + } + + @Override + public boolean canOpenProject(@NotNull VirtualFile file) { + return HaxeProjectFileDetectionUtil.isNMMLProject(file); + } +} diff --git a/src/main/java/com/intellij/plugins/haxe/ide/projectStructure/processor/HaxeOpenOpenFlProjectProcessor.java b/src/main/java/com/intellij/plugins/haxe/ide/projectStructure/processor/HaxeOpenOpenFlProjectProcessor.java new file mode 100644 index 000000000..a8ef6498f --- /dev/null +++ b/src/main/java/com/intellij/plugins/haxe/ide/projectStructure/processor/HaxeOpenOpenFlProjectProcessor.java @@ -0,0 +1,28 @@ +package com.intellij.plugins.haxe.ide.projectStructure.processor; + +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.plugins.haxe.ide.projectStructure.detection.HaxeProjectFileDetectionUtil; +import icons.HaxeIcons; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; + +public class HaxeOpenOpenFlProjectProcessor extends HaxeProjectProcessor { + @NotNull + @Override + public String[] getSupportedExtensions() { + return new String[]{"xml"}; + } + + @Nullable + @Override + public Icon getIcon() { + return HaxeIcons.OPENFL_LOGO; + } + + @Override + public boolean canOpenProject(@NotNull VirtualFile file) { + return HaxeProjectFileDetectionUtil.isOpenFLProject(file); + } +} diff --git a/src/main/java/com/intellij/plugins/haxe/ide/projectStructure/processor/HaxeProjectProcessor.java b/src/main/java/com/intellij/plugins/haxe/ide/projectStructure/processor/HaxeProjectProcessor.java new file mode 100644 index 000000000..1e8904d61 --- /dev/null +++ b/src/main/java/com/intellij/plugins/haxe/ide/projectStructure/processor/HaxeProjectProcessor.java @@ -0,0 +1,27 @@ +package com.intellij.plugins.haxe.ide.projectStructure.processor; + +import com.intellij.ide.util.projectWizard.WizardContext; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.plugins.haxe.ide.projectStructure.HaxeProjectImportBuilder; +import com.intellij.projectImport.ProjectImportBuilder; +import com.intellij.projectImport.ProjectOpenProcessorBase; +import org.jetbrains.annotations.NotNull; + +import javax.swing.*; + +public abstract class HaxeProjectProcessor extends ProjectOpenProcessorBase { + + @Override + protected boolean doQuickImport(@NotNull VirtualFile file, @NotNull WizardContext wizardContext) { + HaxeProjectImportBuilder builder = getBuilder(); + builder.setFileToImport(file.getPath()); + + wizardContext.setProjectName(file.getParent().getName()); + return true; + } + @NotNull + @Override + protected HaxeProjectImportBuilder doGetBuilder() { + return ProjectImportBuilder.EXTENSIONS_POINT_NAME.findExtensionOrFail(HaxeProjectImportBuilder.class); + } +} diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index f1410e6f8..f4cd8ebd6 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -49,10 +49,16 @@ + - + + + + + + diff --git a/src/main/resources/messages/HaxeBundle.properties b/src/main/resources/messages/HaxeBundle.properties index 3a2154095..8eef509e9 100644 --- a/src/main/resources/messages/HaxeBundle.properties +++ b/src/main/resources/messages/HaxeBundle.properties @@ -18,6 +18,7 @@ # limitations under the License. # haxe.title=Haxe +haxe.project=Haxe project haxe.module.type.name=Haxe Module haxe.module.type.description=Encapsulates core functionality for building Haxe applications. \ Support running Haxe application in Neko virtual machine.