IDEA: add WebAssembly facet

This commit is contained in:
Alexey Andreev 2016-11-06 22:00:15 +03:00
parent 156e7c98ee
commit e93a0f1a6e
8 changed files with 155 additions and 16 deletions

View File

@ -15,21 +15,35 @@
*/ */
package org.teavm.idea.jps.model; package org.teavm.idea.jps.model;
import com.intellij.util.xmlb.annotations.Transient;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jps.model.JpsElementChildRole; import org.jetbrains.jps.model.JpsElementChildRole;
import org.jetbrains.jps.model.ex.JpsElementBase; import org.jetbrains.jps.model.ex.JpsElementBase;
import org.jetbrains.jps.model.ex.JpsElementChildRoleBase; import org.jetbrains.jps.model.ex.JpsElementChildRoleBase;
import org.jetbrains.jps.model.module.JpsModule; import org.jetbrains.jps.model.module.JpsModule;
import org.teavm.tooling.TeaVMTargetType;
public class TeaVMJpsConfiguration extends JpsElementBase<TeaVMJpsConfiguration> { public class TeaVMJpsConfiguration extends JpsElementBase<TeaVMJpsConfiguration> {
static final JpsElementChildRole<TeaVMJpsConfiguration> ROLE = JpsElementChildRoleBase.create( static final JpsElementChildRole<TeaVMJpsConfiguration> ROLE = JpsElementChildRoleBase.create(
"TeaVM configuration"); "TeaVM configuration");
@Transient
private TeaVMTargetType targetType;
private String mainClass; private String mainClass;
private String targetDirectory; private String targetDirectory;
private boolean minifying; private boolean minifying;
private boolean sourceMapsFileGenerated = true; private boolean sourceMapsFileGenerated = true;
private boolean sourceFilesCopied = true; private boolean sourceFilesCopied = true;
public TeaVMTargetType getTargetType() {
return targetType;
}
public void setTargetType(TeaVMTargetType targetType) {
this.targetType = targetType;
}
public String getMainClass() { public String getMainClass() {
return mainClass; return mainClass;
} }

View File

@ -24,21 +24,40 @@ import org.jetbrains.jps.model.JpsElement;
import org.jetbrains.jps.model.module.JpsModule; import org.jetbrains.jps.model.module.JpsModule;
import org.jetbrains.jps.model.serialization.JpsModelSerializerExtension; import org.jetbrains.jps.model.serialization.JpsModelSerializerExtension;
import org.jetbrains.jps.model.serialization.facet.JpsFacetConfigurationSerializer; import org.jetbrains.jps.model.serialization.facet.JpsFacetConfigurationSerializer;
import org.teavm.tooling.TeaVMTargetType;
public class TeaVMModelSerializerService extends JpsModelSerializerExtension { public class TeaVMModelSerializerService extends JpsModelSerializerExtension {
@NotNull @NotNull
@Override @Override
public List<? extends JpsFacetConfigurationSerializer<?>> getFacetConfigurationSerializers() { public List<? extends JpsFacetConfigurationSerializer<?>> getFacetConfigurationSerializers() {
return Arrays.asList(serializer); return Arrays.asList(jsSerializer, wasmSerializer);
} }
JpsFacetConfigurationSerializer<TeaVMJpsConfiguration> serializer = JpsFacetConfigurationSerializer<TeaVMJpsConfiguration> jsSerializer =
new JpsFacetConfigurationSerializer<TeaVMJpsConfiguration>(TeaVMJpsConfiguration.ROLE, new JpsFacetConfigurationSerializer<TeaVMJpsConfiguration>(TeaVMJpsConfiguration.ROLE,
"teavm-js", "TeaVM (JS)") { "teavm-js", "TeaVM (JS)") {
@Override @Override
protected TeaVMJpsConfiguration loadExtension(@NotNull Element element, String s, JpsElement jpsElement, protected TeaVMJpsConfiguration loadExtension(@NotNull Element element, String s, JpsElement jpsElement,
JpsModule jpsModule) { JpsModule jpsModule) {
return XmlSerializer.deserialize(element, TeaVMJpsConfiguration.class); TeaVMJpsConfiguration configuration = XmlSerializer.deserialize(element, TeaVMJpsConfiguration.class);
configuration.setTargetType(TeaVMTargetType.JAVASCRIPT);
return configuration;
}
@Override
protected void saveExtension(TeaVMJpsConfiguration configuration, Element element, JpsModule jpsModule) {
}
};
JpsFacetConfigurationSerializer<TeaVMJpsConfiguration> wasmSerializer =
new JpsFacetConfigurationSerializer<TeaVMJpsConfiguration>(TeaVMJpsConfiguration.ROLE,
"teavm-wasm", "TeaVM (WebAssembly)") {
@Override
protected TeaVMJpsConfiguration loadExtension(@NotNull Element element, String s, JpsElement jpsElement,
JpsModule jpsModule) {
TeaVMJpsConfiguration configuration = XmlSerializer.deserialize(element, TeaVMJpsConfiguration.class);
configuration.setTargetType(TeaVMTargetType.WEBASSEMBLY);
return configuration;
} }
@Override @Override

View File

@ -113,6 +113,7 @@ class TeaVMBuild {
TeaVMTool tool = new TeaVMTool(); TeaVMTool tool = new TeaVMTool();
tool.setProgressListener(createProgressListener(context)); tool.setProgressListener(createProgressListener(context));
tool.setLog(new EmptyTeaVMToolLog()); tool.setLog(new EmptyTeaVMToolLog());
tool.setTargetType(config.getTargetType());
tool.setMainClass(config.getMainClass()); tool.setMainClass(config.getMainClass());
tool.setTargetDirectory(new File(config.getTargetDirectory())); tool.setTargetDirectory(new File(config.getTargetDirectory()));
tool.setClassLoader(buildClassLoader()); tool.setClassLoader(buildClassLoader());

View File

@ -16,11 +16,14 @@
package org.teavm.idea; package org.teavm.idea;
import com.intellij.facet.Facet; import com.intellij.facet.Facet;
import com.intellij.facet.FacetType;
import com.intellij.openapi.module.Module; import com.intellij.openapi.module.Module;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class TeaVMFacet extends Facet<TeaVMFacetConfiguration> { public class TeaVMFacet extends Facet<TeaVMFacetConfiguration> {
public TeaVMFacet(@NotNull Module module, @NotNull String name, @NotNull TeaVMFacetConfiguration configuration) { public TeaVMFacet(@NotNull FacetType<TeaVMFacet, TeaVMFacetConfiguration> facetType, @NotNull Module module,
super(TeaVMFacetType.getInstance(), module, name, configuration, null); @NotNull String name, @NotNull TeaVMFacetConfiguration configuration, @Nullable Facet<?> underlyingFacet) {
super(facetType, module, name, configuration, underlyingFacet);
} }
} }

View File

@ -43,7 +43,7 @@ public class TeaVMFacetType extends FacetType<TeaVMFacet, TeaVMFacetConfiguratio
@Override @Override
public TeaVMFacet createFacet(@NotNull Module module, String name, @NotNull TeaVMFacetConfiguration configuration, public TeaVMFacet createFacet(@NotNull Module module, String name, @NotNull TeaVMFacetConfiguration configuration,
@Nullable Facet underlyingFacet) { @Nullable Facet underlyingFacet) {
return new TeaVMFacet(module, name, configuration); return new TeaVMFacet(this, module, name, configuration, underlyingFacet);
} }
@Override @Override

View File

@ -0,0 +1,64 @@
/*
* Copyright 2016 Alexey Andreev.
*
* 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 org.teavm.idea;
import com.intellij.facet.Facet;
import com.intellij.facet.FacetType;
import com.intellij.facet.FacetTypeId;
import com.intellij.facet.FacetTypeRegistry;
import com.intellij.openapi.module.JavaModuleType;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleType;
import com.intellij.openapi.util.IconLoader;
import javax.swing.Icon;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class TeaVMWebAssemblyFacetType extends FacetType<TeaVMFacet, TeaVMFacetConfiguration> {
public static final FacetTypeId<TeaVMFacet> TYPE_ID = new FacetTypeId<>("teavm-wasm");
private static final Icon icon = IconLoader.getIcon("/teavm-16.png");
public TeaVMWebAssemblyFacetType() {
super(TYPE_ID, "teavm-wasm", "TeaVM (WebAssembly)");
}
@Override
public TeaVMFacetConfiguration createDefaultConfiguration() {
return new TeaVMFacetConfiguration();
}
@Override
public TeaVMFacet createFacet(@NotNull Module module, String name, @NotNull TeaVMFacetConfiguration configuration,
@Nullable Facet underlyingFacet) {
return new TeaVMFacet(this, module, name, configuration, underlyingFacet);
}
@Override
public boolean isSuitableModuleType(ModuleType moduleType) {
return moduleType instanceof JavaModuleType;
}
@Nullable
@Override
public Icon getIcon() {
return icon;
}
@NotNull
public static TeaVMWebAssemblyFacetType getInstance() {
return (TeaVMWebAssemblyFacetType) FacetTypeRegistry.getInstance().findFacetType(TYPE_ID);
}
}

View File

@ -16,10 +16,13 @@
package org.teavm.idea.maven; package org.teavm.idea.maven;
import com.intellij.facet.FacetManager; import com.intellij.facet.FacetManager;
import com.intellij.facet.FacetType;
import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider; import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider;
import com.intellij.openapi.module.Module; import com.intellij.openapi.module.Module;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import org.jdom.Element; import org.jdom.Element;
import org.jetbrains.idea.maven.importing.MavenImporter; import org.jetbrains.idea.maven.importing.MavenImporter;
import org.jetbrains.idea.maven.importing.MavenRootModelAdapter; import org.jetbrains.idea.maven.importing.MavenRootModelAdapter;
@ -29,8 +32,11 @@ import org.jetbrains.idea.maven.project.MavenProjectChanges;
import org.jetbrains.idea.maven.project.MavenProjectsProcessorTask; import org.jetbrains.idea.maven.project.MavenProjectsProcessorTask;
import org.jetbrains.idea.maven.project.MavenProjectsTree; import org.jetbrains.idea.maven.project.MavenProjectsTree;
import org.teavm.idea.TeaVMFacet; import org.teavm.idea.TeaVMFacet;
import org.teavm.idea.TeaVMFacetConfiguration;
import org.teavm.idea.TeaVMFacetType; import org.teavm.idea.TeaVMFacetType;
import org.teavm.idea.TeaVMWebAssemblyFacetType;
import org.teavm.idea.jps.model.TeaVMJpsConfiguration; import org.teavm.idea.jps.model.TeaVMJpsConfiguration;
import org.teavm.tooling.TeaVMTargetType;
public class TeaVMMavenImporter extends MavenImporter { public class TeaVMMavenImporter extends MavenImporter {
public TeaVMMavenImporter() { public TeaVMMavenImporter() {
@ -49,35 +55,53 @@ public class TeaVMMavenImporter extends MavenImporter {
List<MavenProjectsProcessorTask> postTasks) { List<MavenProjectsProcessorTask> postTasks) {
FacetManager facetManager = FacetManager.getInstance(module); FacetManager facetManager = FacetManager.getInstance(module);
Set<String> targetTypes = new HashSet<>();
for (MavenPlugin mavenPlugin : mavenProject.getPlugins()) { for (MavenPlugin mavenPlugin : mavenProject.getPlugins()) {
if (mavenPlugin.getGroupId().equals(myPluginGroupID) if (mavenPlugin.getGroupId().equals(myPluginGroupID)
&& mavenPlugin.getArtifactId().equals(myPluginArtifactID)) { && mavenPlugin.getArtifactId().equals(myPluginArtifactID)) {
updateConfiguration(mavenPlugin, facetManager, module); updateConfiguration(mavenPlugin, facetManager, module, targetTypes);
} }
} }
} }
private void updateConfiguration(MavenPlugin plugin, FacetManager facetManager, Module module) { private void updateConfiguration(MavenPlugin plugin, FacetManager facetManager, Module module,
Set<String> targetTypes) {
if (plugin.getConfigurationElement() != null) { if (plugin.getConfigurationElement() != null) {
updateConfiguration(plugin.getConfigurationElement(), facetManager, module); updateConfiguration(plugin.getConfigurationElement(), facetManager, module, targetTypes);
} }
for (MavenPlugin.Execution execution : plugin.getExecutions()) { for (MavenPlugin.Execution execution : plugin.getExecutions()) {
if (execution.getGoals().contains("compile")) { if (execution.getGoals().contains("compile")) {
if (execution.getConfigurationElement() != null) { if (execution.getConfigurationElement() != null) {
updateConfiguration(execution.getConfigurationElement(), facetManager, module); updateConfiguration(execution.getConfigurationElement(), facetManager, module, targetTypes);
} }
break;
} }
} }
} }
private void updateConfiguration(Element source, FacetManager facetManager, Module module) { private void updateConfiguration(Element source, FacetManager facetManager, Module module,
TeaVMFacet facet = facetManager.getFacetByType(TeaVMFacetType.TYPE_ID); Set<String> targetTypes) {
FacetType<TeaVMFacet, TeaVMFacetConfiguration> facetType;
switch (getTargetType(source)) {
case JAVASCRIPT:
facetType = TeaVMFacetType.getInstance();
break;
case WEBASSEMBLY:
facetType = TeaVMWebAssemblyFacetType.getInstance();
break;
default:
return;
}
if (!targetTypes.add(facetType.getStringId())) {
return;
}
TeaVMFacet facet = facetManager.getFacetByType(facetType.getId());
if (facet == null) { if (facet == null) {
TeaVMFacetType type = TeaVMFacetType.getInstance(); facet = new TeaVMFacet(facetType, module, facetType.getDefaultFacetName(),
facet = new TeaVMFacet(module, "TeaVM (JS)", type.createDefaultConfiguration()); facetType.createDefaultConfiguration(), null);
facetManager.addFacet(type, facet.getName(), facet); facetManager.addFacet(facetType, facet.getName(), facet);
} }
TeaVMJpsConfiguration configuration = facet.getConfiguration().getState(); TeaVMJpsConfiguration configuration = facet.getConfiguration().getState();
@ -104,4 +128,17 @@ public class TeaVMMavenImporter extends MavenImporter {
facet.getConfiguration().loadState(configuration); facet.getConfiguration().loadState(configuration);
} }
private TeaVMTargetType getTargetType(Element source) {
for (Element child : source.getChildren()) {
if (child.getName().equals("targetType")) {
try {
return TeaVMTargetType.valueOf(child.getTextTrim());
} catch (IllegalArgumentException e) {
// do nothing, continue iterating
}
}
}
return TeaVMTargetType.JAVASCRIPT;
}
} }

View File

@ -32,6 +32,7 @@
<programRunner implementation="org.teavm.idea.debug.TeaVMDebugRunner"/> <programRunner implementation="org.teavm.idea.debug.TeaVMDebugRunner"/>
<facetType implementation="org.teavm.idea.TeaVMFacetType"/> <facetType implementation="org.teavm.idea.TeaVMFacetType"/>
<facetType implementation="org.teavm.idea.TeaVMWebAssemblyFacetType"/>
</extensions> </extensions>
<extensions defaultExtensionNs="org.jetbrains.idea.maven"> <extensions defaultExtensionNs="org.jetbrains.idea.maven">