mirror of
https://github.com/Eaglercraft-TeaVM-Fork/eagler-teavm.git
synced 2024-12-22 00:04:10 -08:00
New IDEA module kind based on Gradle
This commit is contained in:
parent
8963b00ed4
commit
2a0f6f206e
|
@ -1,11 +0,0 @@
|
||||||
<component name="ProjectRunConfigurationManager">
|
|
||||||
<configuration default="false" name="IDEA" type="#org.jetbrains.idea.devkit.run.PluginConfigurationType">
|
|
||||||
<module name="teavm-idea" />
|
|
||||||
<option name="VM_PARAMETERS" value="-Xmx1024m -Xms256m -ea" />
|
|
||||||
<option name="PROGRAM_PARAMETERS" value="" />
|
|
||||||
<predefined_log_file enabled="true" id="idea.log" />
|
|
||||||
<method v="2">
|
|
||||||
<option name="Make" enabled="true" />
|
|
||||||
</method>
|
|
||||||
</configuration>
|
|
||||||
</component>
|
|
24
.run/Run IDEA plugin.run.xml
Normal file
24
.run/Run IDEA plugin.run.xml
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
<component name="ProjectRunConfigurationManager">
|
||||||
|
<configuration default="false" name="Run IDEA plugin" type="GradleRunConfiguration" factoryName="Gradle">
|
||||||
|
<log_file alias="idea.log" path="$PROJECT_DIR$/build/idea-sandbox/system/log/idea.log" />
|
||||||
|
<ExternalSystemSettings>
|
||||||
|
<option name="executionName" />
|
||||||
|
<option name="externalProjectPath" value="$PROJECT_DIR$/tools/idea" />
|
||||||
|
<option name="externalSystemIdString" value="GRADLE" />
|
||||||
|
<option name="scriptParameters" value="" />
|
||||||
|
<option name="taskDescriptions">
|
||||||
|
<list />
|
||||||
|
</option>
|
||||||
|
<option name="taskNames">
|
||||||
|
<list>
|
||||||
|
<option value="runIde" />
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
<option name="vmOptions" value="" />
|
||||||
|
</ExternalSystemSettings>
|
||||||
|
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
|
||||||
|
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
|
||||||
|
<DebugAllEnabled>false</DebugAllEnabled>
|
||||||
|
<method v="2" />
|
||||||
|
</configuration>
|
||||||
|
</component>
|
|
@ -16,13 +16,11 @@
|
||||||
package org.teavm.debugging;
|
package org.teavm.debugging;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import org.teavm.backend.wasm.debug.info.DebugInfo;
|
|
||||||
import org.teavm.common.Promise;
|
import org.teavm.common.Promise;
|
||||||
import org.teavm.debugging.javascript.JavaScriptValue;
|
import org.teavm.debugging.javascript.JavaScriptValue;
|
||||||
|
|
||||||
public abstract class Value {
|
public abstract class Value {
|
||||||
Debugger debugger;
|
Debugger debugger;
|
||||||
private DebugInfo wasmDebugInfo;
|
|
||||||
private Promise<Map<String, Variable>> properties;
|
private Promise<Map<String, Variable>> properties;
|
||||||
private Promise<String> type;
|
private Promise<String> type;
|
||||||
|
|
||||||
|
|
|
@ -480,15 +480,7 @@ class WasmValueImpl extends Value {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Promise<Boolean> hasInnerStructure() {
|
public Promise<Boolean> hasInnerStructure() {
|
||||||
return getCalculatedType().then(type -> {
|
return Promise.of(type == FieldType.OBJECT && longValue != 0);
|
||||||
switch (type.kind()) {
|
|
||||||
case CLASS:
|
|
||||||
case ARRAY:
|
|
||||||
return true;
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
6
pom.xml
6
pom.xml
|
@ -90,8 +90,6 @@
|
||||||
<jackson.version>2.12.2</jackson.version>
|
<jackson.version>2.12.2</jackson.version>
|
||||||
<gson.version>2.8.6</gson.version>
|
<gson.version>2.8.6</gson.version>
|
||||||
|
|
||||||
<idea.version>2018.2.8</idea.version>
|
|
||||||
|
|
||||||
<maven-plugin-api.version>3.3.3</maven-plugin-api.version>
|
<maven-plugin-api.version>3.3.3</maven-plugin-api.version>
|
||||||
<maven-plugin-annotations.version>3.3</maven-plugin-annotations.version>
|
<maven-plugin-annotations.version>3.3</maven-plugin-annotations.version>
|
||||||
|
|
||||||
|
@ -415,9 +413,9 @@
|
||||||
</profile>
|
</profile>
|
||||||
|
|
||||||
<profile>
|
<profile>
|
||||||
<id>with-idea</id>
|
<id>with-ide-deps</id>
|
||||||
<modules>
|
<modules>
|
||||||
<module>tools/idea</module>
|
<module>tools/ide-deps</module>
|
||||||
</modules>
|
</modules>
|
||||||
</profile>
|
</profile>
|
||||||
|
|
||||||
|
|
113
tools/ide-deps/pom.xml
Normal file
113
tools/ide-deps/pom.xml
Normal file
|
@ -0,0 +1,113 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
~ Copyright 2022 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<parent>
|
||||||
|
<groupId>org.teavm</groupId>
|
||||||
|
<artifactId>teavm</artifactId>
|
||||||
|
<version>0.7.0-SNAPSHOT</version>
|
||||||
|
<relativePath>../../pom.xml</relativePath>
|
||||||
|
</parent>
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<artifactId>teavm-ide-deps</artifactId>
|
||||||
|
<name>TeaVM fat JAR for IDEs</name>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.teavm</groupId>
|
||||||
|
<artifactId>teavm-tooling</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.teavm</groupId>
|
||||||
|
<artifactId>teavm-devserver</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.teavm</groupId>
|
||||||
|
<artifactId>teavm-classlib</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.teavm</groupId>
|
||||||
|
<artifactId>teavm-chrome-rdp</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-shade-plugin</artifactId>
|
||||||
|
<version>${maven-shade-plugin.version}</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>shade</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<atrifactSet>
|
||||||
|
<excludes>
|
||||||
|
<exclude>com.jetbrains.intellij.idea:ideaIC:zip:*</exclude>
|
||||||
|
<exclude>joda-time:joda-time</exclude>
|
||||||
|
</excludes>
|
||||||
|
</atrifactSet>
|
||||||
|
<shadedArtifactAttached>true</shadedArtifactAttached>
|
||||||
|
<relocations>
|
||||||
|
<relocation>
|
||||||
|
<pattern>com.google.gson</pattern>
|
||||||
|
<shadedPattern>org.teavm.shade.gson</shadedPattern>
|
||||||
|
</relocation>
|
||||||
|
<relocation>
|
||||||
|
<pattern>com.jcraft.jzlib</pattern>
|
||||||
|
<shadedPattern>org.teavm.shade.jzlib</shadedPattern>
|
||||||
|
</relocation>
|
||||||
|
<relocation>
|
||||||
|
<pattern>org.eclipse.jetty</pattern>
|
||||||
|
<shadedPattern>org.teavm.shade.jetty</shadedPattern>
|
||||||
|
</relocation>
|
||||||
|
<relocation>
|
||||||
|
<pattern>org.joda.time</pattern>
|
||||||
|
<shadedPattern>org.teavm.shade.jodatime</shadedPattern>
|
||||||
|
</relocation>
|
||||||
|
<relocation>
|
||||||
|
<pattern>org.objectweb.asm</pattern>
|
||||||
|
<shadedPattern>org.teavm.shade.jetty.asm</shadedPattern>
|
||||||
|
</relocation>
|
||||||
|
<relocation>
|
||||||
|
<pattern>org.slf4j</pattern>
|
||||||
|
<shadedPattern>org.teavm.shade.slf4j</shadedPattern>
|
||||||
|
</relocation>
|
||||||
|
<relocation>
|
||||||
|
<pattern>org.apache.commons</pattern>
|
||||||
|
<shadedPattern>org.teavm.apachecommons</shadedPattern>
|
||||||
|
</relocation>
|
||||||
|
</relocations>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</project>
|
5
tools/idea/.gitignore
vendored
Normal file
5
tools/idea/.gitignore
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
.gradle
|
||||||
|
build/
|
||||||
|
!gradle/wrapper/gradle-wrapper.jar
|
||||||
|
!**/src/main/**/build/
|
||||||
|
!**/src/test/**/build/
|
58
tools/idea/build.gradle.kts
Normal file
58
tools/idea/build.gradle.kts
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2022 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
plugins {
|
||||||
|
id("java")
|
||||||
|
id("checkstyle")
|
||||||
|
id("org.jetbrains.intellij") version "1.10.1"
|
||||||
|
}
|
||||||
|
|
||||||
|
group = "org.teavm"
|
||||||
|
version = "0.7.0-SNAPSHOT"
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
mavenCentral()
|
||||||
|
mavenLocal()
|
||||||
|
}
|
||||||
|
|
||||||
|
intellij {
|
||||||
|
version.set("2020.1.4")
|
||||||
|
type.set("IC") // Target IDE Platform
|
||||||
|
|
||||||
|
plugins.set(listOf("java", "org.intellij.scala:2020.1.43", "org.jetbrains.kotlin"))
|
||||||
|
}
|
||||||
|
|
||||||
|
checkstyle {
|
||||||
|
toolVersion = "8.41"
|
||||||
|
configFile = File("../../checkstyle.xml")
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation(group = "org.teavm", name = "teavm-ide-deps", version = project.version.toString(),
|
||||||
|
classifier = "shaded")
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks {
|
||||||
|
withType<JavaCompile> {
|
||||||
|
sourceCompatibility = "11"
|
||||||
|
targetCompatibility = "11"
|
||||||
|
}
|
||||||
|
|
||||||
|
patchPluginXml {
|
||||||
|
sinceBuild.set("201")
|
||||||
|
untilBuild.set("231.*")
|
||||||
|
}
|
||||||
|
}
|
BIN
tools/idea/gradle/wrapper/gradle-wrapper.jar
vendored
Normal file
BIN
tools/idea/gradle/wrapper/gradle-wrapper.jar
vendored
Normal file
Binary file not shown.
5
tools/idea/gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
5
tools/idea/gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
distributionBase=GRADLE_USER_HOME
|
||||||
|
distributionPath=wrapper/dists
|
||||||
|
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip
|
||||||
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
zipStorePath=wrapper/dists
|
234
tools/idea/gradlew
vendored
Executable file
234
tools/idea/gradlew
vendored
Executable file
|
@ -0,0 +1,234 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
#
|
||||||
|
# Copyright © 2015-2021 the original authors.
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
#
|
||||||
|
# https://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.
|
||||||
|
#
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# Gradle start up script for POSIX generated by Gradle.
|
||||||
|
#
|
||||||
|
# Important for running:
|
||||||
|
#
|
||||||
|
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
|
||||||
|
# noncompliant, but you have some other compliant shell such as ksh or
|
||||||
|
# bash, then to run this script, type that shell name before the whole
|
||||||
|
# command line, like:
|
||||||
|
#
|
||||||
|
# ksh Gradle
|
||||||
|
#
|
||||||
|
# Busybox and similar reduced shells will NOT work, because this script
|
||||||
|
# requires all of these POSIX shell features:
|
||||||
|
# * functions;
|
||||||
|
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
|
||||||
|
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
|
||||||
|
# * compound commands having a testable exit status, especially «case»;
|
||||||
|
# * various built-in commands including «command», «set», and «ulimit».
|
||||||
|
#
|
||||||
|
# Important for patching:
|
||||||
|
#
|
||||||
|
# (2) This script targets any POSIX shell, so it avoids extensions provided
|
||||||
|
# by Bash, Ksh, etc; in particular arrays are avoided.
|
||||||
|
#
|
||||||
|
# The "traditional" practice of packing multiple parameters into a
|
||||||
|
# space-separated string is a well documented source of bugs and security
|
||||||
|
# problems, so this is (mostly) avoided, by progressively accumulating
|
||||||
|
# options in "$@", and eventually passing that to Java.
|
||||||
|
#
|
||||||
|
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
|
||||||
|
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
|
||||||
|
# see the in-line comments for details.
|
||||||
|
#
|
||||||
|
# There are tweaks for specific operating systems such as AIX, CygWin,
|
||||||
|
# Darwin, MinGW, and NonStop.
|
||||||
|
#
|
||||||
|
# (3) This script is generated from the Groovy template
|
||||||
|
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||||
|
# within the Gradle project.
|
||||||
|
#
|
||||||
|
# You can find Gradle at https://github.com/gradle/gradle/.
|
||||||
|
#
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
# Attempt to set APP_HOME
|
||||||
|
|
||||||
|
# Resolve links: $0 may be a link
|
||||||
|
app_path=$0
|
||||||
|
|
||||||
|
# Need this for daisy-chained symlinks.
|
||||||
|
while
|
||||||
|
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
|
||||||
|
[ -h "$app_path" ]
|
||||||
|
do
|
||||||
|
ls=$( ls -ld "$app_path" )
|
||||||
|
link=${ls#*' -> '}
|
||||||
|
case $link in #(
|
||||||
|
/*) app_path=$link ;; #(
|
||||||
|
*) app_path=$APP_HOME$link ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
|
||||||
|
|
||||||
|
APP_NAME="Gradle"
|
||||||
|
APP_BASE_NAME=${0##*/}
|
||||||
|
|
||||||
|
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||||
|
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||||
|
|
||||||
|
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||||
|
MAX_FD=maximum
|
||||||
|
|
||||||
|
warn () {
|
||||||
|
echo "$*"
|
||||||
|
} >&2
|
||||||
|
|
||||||
|
die () {
|
||||||
|
echo
|
||||||
|
echo "$*"
|
||||||
|
echo
|
||||||
|
exit 1
|
||||||
|
} >&2
|
||||||
|
|
||||||
|
# OS specific support (must be 'true' or 'false').
|
||||||
|
cygwin=false
|
||||||
|
msys=false
|
||||||
|
darwin=false
|
||||||
|
nonstop=false
|
||||||
|
case "$( uname )" in #(
|
||||||
|
CYGWIN* ) cygwin=true ;; #(
|
||||||
|
Darwin* ) darwin=true ;; #(
|
||||||
|
MSYS* | MINGW* ) msys=true ;; #(
|
||||||
|
NONSTOP* ) nonstop=true ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||||
|
|
||||||
|
|
||||||
|
# Determine the Java command to use to start the JVM.
|
||||||
|
if [ -n "$JAVA_HOME" ] ; then
|
||||||
|
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||||
|
# IBM's JDK on AIX uses strange locations for the executables
|
||||||
|
JAVACMD=$JAVA_HOME/jre/sh/java
|
||||||
|
else
|
||||||
|
JAVACMD=$JAVA_HOME/bin/java
|
||||||
|
fi
|
||||||
|
if [ ! -x "$JAVACMD" ] ; then
|
||||||
|
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
||||||
|
|
||||||
|
Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
location of your Java installation."
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
JAVACMD=java
|
||||||
|
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||||
|
|
||||||
|
Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
location of your Java installation."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Increase the maximum file descriptors if we can.
|
||||||
|
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
||||||
|
case $MAX_FD in #(
|
||||||
|
max*)
|
||||||
|
MAX_FD=$( ulimit -H -n ) ||
|
||||||
|
warn "Could not query maximum file descriptor limit"
|
||||||
|
esac
|
||||||
|
case $MAX_FD in #(
|
||||||
|
'' | soft) :;; #(
|
||||||
|
*)
|
||||||
|
ulimit -n "$MAX_FD" ||
|
||||||
|
warn "Could not set maximum file descriptor limit to $MAX_FD"
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Collect all arguments for the java command, stacking in reverse order:
|
||||||
|
# * args from the command line
|
||||||
|
# * the main class name
|
||||||
|
# * -classpath
|
||||||
|
# * -D...appname settings
|
||||||
|
# * --module-path (only if needed)
|
||||||
|
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
|
||||||
|
|
||||||
|
# For Cygwin or MSYS, switch paths to Windows format before running java
|
||||||
|
if "$cygwin" || "$msys" ; then
|
||||||
|
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
|
||||||
|
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
|
||||||
|
|
||||||
|
JAVACMD=$( cygpath --unix "$JAVACMD" )
|
||||||
|
|
||||||
|
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||||
|
for arg do
|
||||||
|
if
|
||||||
|
case $arg in #(
|
||||||
|
-*) false ;; # don't mess with options #(
|
||||||
|
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
|
||||||
|
[ -e "$t" ] ;; #(
|
||||||
|
*) false ;;
|
||||||
|
esac
|
||||||
|
then
|
||||||
|
arg=$( cygpath --path --ignore --mixed "$arg" )
|
||||||
|
fi
|
||||||
|
# Roll the args list around exactly as many times as the number of
|
||||||
|
# args, so each arg winds up back in the position where it started, but
|
||||||
|
# possibly modified.
|
||||||
|
#
|
||||||
|
# NB: a `for` loop captures its iteration list before it begins, so
|
||||||
|
# changing the positional parameters here affects neither the number of
|
||||||
|
# iterations, nor the values presented in `arg`.
|
||||||
|
shift # remove old arg
|
||||||
|
set -- "$@" "$arg" # push replacement arg
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Collect all arguments for the java command;
|
||||||
|
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
|
||||||
|
# shell script including quotes and variable substitutions, so put them in
|
||||||
|
# double quotes to make sure that they get re-expanded; and
|
||||||
|
# * put everything else in single quotes, so that it's not re-expanded.
|
||||||
|
|
||||||
|
set -- \
|
||||||
|
"-Dorg.gradle.appname=$APP_BASE_NAME" \
|
||||||
|
-classpath "$CLASSPATH" \
|
||||||
|
org.gradle.wrapper.GradleWrapperMain \
|
||||||
|
"$@"
|
||||||
|
|
||||||
|
# Use "xargs" to parse quoted args.
|
||||||
|
#
|
||||||
|
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
|
||||||
|
#
|
||||||
|
# In Bash we could simply go:
|
||||||
|
#
|
||||||
|
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
|
||||||
|
# set -- "${ARGS[@]}" "$@"
|
||||||
|
#
|
||||||
|
# but POSIX shell has neither arrays nor command substitution, so instead we
|
||||||
|
# post-process each arg (as a line of input to sed) to backslash-escape any
|
||||||
|
# character that might be a shell metacharacter, then use eval to reverse
|
||||||
|
# that process (while maintaining the separation between arguments), and wrap
|
||||||
|
# the whole thing up as a single "set" statement.
|
||||||
|
#
|
||||||
|
# This will of course break if any of these variables contains a newline or
|
||||||
|
# an unmatched quote.
|
||||||
|
#
|
||||||
|
|
||||||
|
eval "set -- $(
|
||||||
|
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
|
||||||
|
xargs -n1 |
|
||||||
|
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
|
||||||
|
tr '\n' ' '
|
||||||
|
)" '"$@"'
|
||||||
|
|
||||||
|
exec "$JAVACMD" "$@"
|
89
tools/idea/gradlew.bat
vendored
Normal file
89
tools/idea/gradlew.bat
vendored
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
@rem
|
||||||
|
@rem Copyright 2015 the original author or authors.
|
||||||
|
@rem
|
||||||
|
@rem Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
@rem you may not use this file except in compliance with the License.
|
||||||
|
@rem You may obtain a copy of the License at
|
||||||
|
@rem
|
||||||
|
@rem https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
@rem
|
||||||
|
@rem Unless required by applicable law or agreed to in writing, software
|
||||||
|
@rem distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
@rem See the License for the specific language governing permissions and
|
||||||
|
@rem limitations under the License.
|
||||||
|
@rem
|
||||||
|
|
||||||
|
@if "%DEBUG%" == "" @echo off
|
||||||
|
@rem ##########################################################################
|
||||||
|
@rem
|
||||||
|
@rem Gradle startup script for Windows
|
||||||
|
@rem
|
||||||
|
@rem ##########################################################################
|
||||||
|
|
||||||
|
@rem Set local scope for the variables with windows NT shell
|
||||||
|
if "%OS%"=="Windows_NT" setlocal
|
||||||
|
|
||||||
|
set DIRNAME=%~dp0
|
||||||
|
if "%DIRNAME%" == "" set DIRNAME=.
|
||||||
|
set APP_BASE_NAME=%~n0
|
||||||
|
set APP_HOME=%DIRNAME%
|
||||||
|
|
||||||
|
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
|
||||||
|
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
|
||||||
|
|
||||||
|
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||||
|
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
|
||||||
|
|
||||||
|
@rem Find java.exe
|
||||||
|
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||||
|
|
||||||
|
set JAVA_EXE=java.exe
|
||||||
|
%JAVA_EXE% -version >NUL 2>&1
|
||||||
|
if "%ERRORLEVEL%" == "0" goto execute
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||||
|
echo.
|
||||||
|
echo Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
echo location of your Java installation.
|
||||||
|
|
||||||
|
goto fail
|
||||||
|
|
||||||
|
:findJavaFromJavaHome
|
||||||
|
set JAVA_HOME=%JAVA_HOME:"=%
|
||||||
|
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||||
|
|
||||||
|
if exist "%JAVA_EXE%" goto execute
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||||
|
echo.
|
||||||
|
echo Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
echo location of your Java installation.
|
||||||
|
|
||||||
|
goto fail
|
||||||
|
|
||||||
|
:execute
|
||||||
|
@rem Setup the command line
|
||||||
|
|
||||||
|
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||||
|
|
||||||
|
|
||||||
|
@rem Execute Gradle
|
||||||
|
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
|
||||||
|
|
||||||
|
:end
|
||||||
|
@rem End local scope for the variables with windows NT shell
|
||||||
|
if "%ERRORLEVEL%"=="0" goto mainEnd
|
||||||
|
|
||||||
|
:fail
|
||||||
|
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||||
|
rem the _cmd.exe /c_ return code!
|
||||||
|
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
||||||
|
exit /b 1
|
||||||
|
|
||||||
|
:mainEnd
|
||||||
|
if "%OS%"=="Windows_NT" endlocal
|
||||||
|
|
||||||
|
:omega
|
1
tools/idea/idea-artifacts/.gitignore
vendored
1
tools/idea/idea-artifacts/.gitignore
vendored
|
@ -1 +0,0 @@
|
||||||
/dependencies
|
|
|
@ -1,387 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
~ Copyright 2017 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.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<groupId>org.teavm</groupId>
|
|
||||||
<artifactId>teavm-idea-dependencies</artifactId>
|
|
||||||
<version>1.0.0-SNAPSHOT</version>
|
|
||||||
|
|
||||||
<repositories>
|
|
||||||
<repository>
|
|
||||||
<id>idea-releases</id>
|
|
||||||
<url>https://www.jetbrains.com/intellij-repository/releases</url>
|
|
||||||
</repository>
|
|
||||||
</repositories>
|
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.jetbrains.intellij.idea</groupId>
|
|
||||||
<artifactId>ideaIC</artifactId>
|
|
||||||
<version>${idea.version}</version>
|
|
||||||
<type>zip</type>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm</groupId>
|
|
||||||
<artifactId>teavm-tooling</artifactId>
|
|
||||||
<version>${teavm.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm</groupId>
|
|
||||||
<artifactId>teavm-devserver</artifactId>
|
|
||||||
<version>${teavm.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm</groupId>
|
|
||||||
<artifactId>teavm-classlib</artifactId>
|
|
||||||
<version>${teavm.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm</groupId>
|
|
||||||
<artifactId>teavm-chrome-rdp</artifactId>
|
|
||||||
<version>${teavm.version}</version>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
<build>
|
|
||||||
<plugins>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-dependency-plugin</artifactId>
|
|
||||||
<version>3.0.0</version>
|
|
||||||
<executions>
|
|
||||||
<execution>
|
|
||||||
<id>unpack-idea</id>
|
|
||||||
<phase>compile</phase>
|
|
||||||
<goals>
|
|
||||||
<goal>unpack-dependencies</goal>
|
|
||||||
</goals>
|
|
||||||
<configuration>
|
|
||||||
<includeGroupIds>com.jetbrains.intellij.idea</includeGroupIds>
|
|
||||||
<includeArtifactIds>ideaIC</includeArtifactIds>
|
|
||||||
<outputDirectory>${basedir}/dependencies/idea</outputDirectory>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
</executions>
|
|
||||||
</plugin>
|
|
||||||
|
|
||||||
<plugin>
|
|
||||||
<artifactId>maven-antrun-plugin</artifactId>
|
|
||||||
<version>1.8</version>
|
|
||||||
<executions>
|
|
||||||
<execution>
|
|
||||||
<phase>process-resources</phase>
|
|
||||||
<configuration>
|
|
||||||
<target>
|
|
||||||
<mkdir dir="${basedir}/dependencies/"/>
|
|
||||||
<get src="https://plugins.jetbrains.com/plugin/download?updateId=42362"
|
|
||||||
dest="${basedir}/dependencies/scala.zip" skipexisting="true"/>
|
|
||||||
<unzip src="${basedir}/dependencies/scala.zip" dest="${basedir}/dependencies"/>
|
|
||||||
</target>
|
|
||||||
</configuration>
|
|
||||||
<goals>
|
|
||||||
<goal>run</goal>
|
|
||||||
</goals>
|
|
||||||
</execution>
|
|
||||||
</executions>
|
|
||||||
</plugin>
|
|
||||||
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-shade-plugin</artifactId>
|
|
||||||
<version>3.4.0</version>
|
|
||||||
<executions>
|
|
||||||
<execution>
|
|
||||||
<phase>package</phase>
|
|
||||||
<goals>
|
|
||||||
<goal>shade</goal>
|
|
||||||
</goals>
|
|
||||||
<configuration>
|
|
||||||
<atrifactSet>
|
|
||||||
<excludes>
|
|
||||||
<exclude>com.jetbrains.intellij.idea:ideaIC:zip:*</exclude>
|
|
||||||
<exclude>joda-time:joda-time</exclude>
|
|
||||||
</excludes>
|
|
||||||
</atrifactSet>
|
|
||||||
<createDependencyReducedPom>false</createDependencyReducedPom>
|
|
||||||
<outputFile>dependencies/teavm.jar</outputFile>
|
|
||||||
<relocations>
|
|
||||||
<relocation>
|
|
||||||
<pattern>com.google.gson</pattern>
|
|
||||||
<shadedPattern>org.teavm.shade.gson</shadedPattern>
|
|
||||||
</relocation>
|
|
||||||
<relocation>
|
|
||||||
<pattern>com.jcraft.jzlib</pattern>
|
|
||||||
<shadedPattern>org.teavm.shade.jzlib</shadedPattern>
|
|
||||||
</relocation>
|
|
||||||
<relocation>
|
|
||||||
<pattern>org.eclipse.jetty</pattern>
|
|
||||||
<shadedPattern>org.teavm.shade.jetty</shadedPattern>
|
|
||||||
</relocation>
|
|
||||||
<relocation>
|
|
||||||
<pattern>org.joda.time</pattern>
|
|
||||||
<shadedPattern>org.teavm.shade.jodatime</shadedPattern>
|
|
||||||
</relocation>
|
|
||||||
<relocation>
|
|
||||||
<pattern>org.objectweb.asm</pattern>
|
|
||||||
<shadedPattern>org.teavm.shade.jetty.asm</shadedPattern>
|
|
||||||
</relocation>
|
|
||||||
<relocation>
|
|
||||||
<pattern>org.slf4j</pattern>
|
|
||||||
<shadedPattern>org.teavm.shade.slf4j</shadedPattern>
|
|
||||||
</relocation>
|
|
||||||
<relocation>
|
|
||||||
<pattern>org.apache.commons</pattern>
|
|
||||||
<shadedPattern>org.teavm.apachecommons</shadedPattern>
|
|
||||||
</relocation>
|
|
||||||
</relocations>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
</executions>
|
|
||||||
</plugin>
|
|
||||||
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-install-plugin</artifactId>
|
|
||||||
<version>2.5.2</version>
|
|
||||||
<executions>
|
|
||||||
<execution>
|
|
||||||
<id>teavm</id>
|
|
||||||
<goals>
|
|
||||||
<goal>install-file</goal>
|
|
||||||
</goals>
|
|
||||||
<phase>install</phase>
|
|
||||||
<configuration>
|
|
||||||
<file>dependencies/teavm.jar</file>
|
|
||||||
<artifactId>teavm</artifactId>
|
|
||||||
<version>${teavm.version}</version>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
<execution>
|
|
||||||
<id>openapi</id>
|
|
||||||
<goals>
|
|
||||||
<goal>install-file</goal>
|
|
||||||
</goals>
|
|
||||||
<phase>prepare-package</phase>
|
|
||||||
<configuration>
|
|
||||||
<file>dependencies/idea/lib/openapi.jar</file>
|
|
||||||
<artifactId>openapi</artifactId>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
<execution>
|
|
||||||
<id>util</id>
|
|
||||||
<goals>
|
|
||||||
<goal>install-file</goal>
|
|
||||||
</goals>
|
|
||||||
<phase>prepare-package</phase>
|
|
||||||
<configuration>
|
|
||||||
<file>dependencies/idea/lib/util.jar</file>
|
|
||||||
<artifactId>util</artifactId>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
<execution>
|
|
||||||
<id>extensions</id>
|
|
||||||
<goals>
|
|
||||||
<goal>install-file</goal>
|
|
||||||
</goals>
|
|
||||||
<phase>prepare-package</phase>
|
|
||||||
<configuration>
|
|
||||||
<file>dependencies/idea/lib/extensions.jar</file>
|
|
||||||
<artifactId>extensions</artifactId>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
<execution>
|
|
||||||
<id>annotations</id>
|
|
||||||
<goals>
|
|
||||||
<goal>install-file</goal>
|
|
||||||
</goals>
|
|
||||||
<phase>prepare-package</phase>
|
|
||||||
<configuration>
|
|
||||||
<file>dependencies/idea/lib/annotations.jar</file>
|
|
||||||
<artifactId>annotations</artifactId>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
<execution>
|
|
||||||
<id>jdom</id>
|
|
||||||
<goals>
|
|
||||||
<goal>install-file</goal>
|
|
||||||
</goals>
|
|
||||||
<phase>prepare-package</phase>
|
|
||||||
<configuration>
|
|
||||||
<file>dependencies/idea/lib/jdom.jar</file>
|
|
||||||
<artifactId>jdom</artifactId>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
<execution>
|
|
||||||
<id>maven</id>
|
|
||||||
<goals>
|
|
||||||
<goal>install-file</goal>
|
|
||||||
</goals>
|
|
||||||
<phase>prepare-package</phase>
|
|
||||||
<configuration>
|
|
||||||
<file>dependencies/idea/plugins/maven/lib/maven.jar</file>
|
|
||||||
<artifactId>maven</artifactId>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
<execution>
|
|
||||||
<id>maven-server-api</id>
|
|
||||||
<goals>
|
|
||||||
<goal>install-file</goal>
|
|
||||||
</goals>
|
|
||||||
<phase>prepare-package</phase>
|
|
||||||
<configuration>
|
|
||||||
<file>dependencies/idea/plugins/maven/lib/maven-server-api.jar</file>
|
|
||||||
<artifactId>maven-server-api</artifactId>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
<execution>
|
|
||||||
<id>idea</id>
|
|
||||||
<goals>
|
|
||||||
<goal>install-file</goal>
|
|
||||||
</goals>
|
|
||||||
<phase>prepare-package</phase>
|
|
||||||
<configuration>
|
|
||||||
<file>dependencies/idea/lib/idea.jar</file>
|
|
||||||
<artifactId>idea</artifactId>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
<execution>
|
|
||||||
<id>jps-model</id>
|
|
||||||
<goals>
|
|
||||||
<goal>install-file</goal>
|
|
||||||
</goals>
|
|
||||||
<phase>prepare-package</phase>
|
|
||||||
<configuration>
|
|
||||||
<file>dependencies/idea/lib/jps-model.jar</file>
|
|
||||||
<artifactId>jps-model</artifactId>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
<execution>
|
|
||||||
<id>platform-api</id>
|
|
||||||
<goals>
|
|
||||||
<goal>install-file</goal>
|
|
||||||
</goals>
|
|
||||||
<phase>prepare-package</phase>
|
|
||||||
<configuration>
|
|
||||||
<file>dependencies/idea/lib/platform-api.jar</file>
|
|
||||||
<artifactId>platform-api</artifactId>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
<execution>
|
|
||||||
<id>platform-impl</id>
|
|
||||||
<goals>
|
|
||||||
<goal>install-file</goal>
|
|
||||||
</goals>
|
|
||||||
<phase>prepare-package</phase>
|
|
||||||
<configuration>
|
|
||||||
<file>dependencies/idea/lib/platform-impl.jar</file>
|
|
||||||
<artifactId>platform-impl</artifactId>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
<execution>
|
|
||||||
<id>java-api</id>
|
|
||||||
<goals>
|
|
||||||
<goal>install-file</goal>
|
|
||||||
</goals>
|
|
||||||
<phase>prepare-package</phase>
|
|
||||||
<configuration>
|
|
||||||
<file>dependencies/idea/lib/java-api.jar</file>
|
|
||||||
<artifactId>java-api</artifactId>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
<execution>
|
|
||||||
<id>java-impl</id>
|
|
||||||
<goals>
|
|
||||||
<goal>install-file</goal>
|
|
||||||
</goals>
|
|
||||||
<phase>prepare-package</phase>
|
|
||||||
<configuration>
|
|
||||||
<file>dependencies/idea/lib/java-impl.jar</file>
|
|
||||||
<artifactId>java-impl</artifactId>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
<execution>
|
|
||||||
<id>jps-builders</id>
|
|
||||||
<goals>
|
|
||||||
<goal>install-file</goal>
|
|
||||||
</goals>
|
|
||||||
<phase>prepare-package</phase>
|
|
||||||
<configuration>
|
|
||||||
<file>dependencies/idea/lib/jps-builders.jar</file>
|
|
||||||
<artifactId>jps-builders</artifactId>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
<execution>
|
|
||||||
<id>jps-builders-6</id>
|
|
||||||
<goals>
|
|
||||||
<goal>install-file</goal>
|
|
||||||
</goals>
|
|
||||||
<phase>prepare-package</phase>
|
|
||||||
<configuration>
|
|
||||||
<file>dependencies/idea/lib/jps-builders-6.jar</file>
|
|
||||||
<artifactId>jps-builders-6</artifactId>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
<execution>
|
|
||||||
<id>log4j</id>
|
|
||||||
<goals>
|
|
||||||
<goal>install-file</goal>
|
|
||||||
</goals>
|
|
||||||
<phase>prepare-package</phase>
|
|
||||||
<configuration>
|
|
||||||
<file>dependencies/idea/lib/commons-logging-1.2.jar</file>
|
|
||||||
<artifactId>commons-logging</artifactId>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
<execution>
|
|
||||||
<id>kotlin</id>
|
|
||||||
<goals>
|
|
||||||
<goal>install-file</goal>
|
|
||||||
</goals>
|
|
||||||
<phase>prepare-package</phase>
|
|
||||||
<configuration>
|
|
||||||
<file>dependencies/idea/plugins/Kotlin/lib/kotlin-plugin.jar</file>
|
|
||||||
<artifactId>kotlin-plugin</artifactId>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
<execution>
|
|
||||||
<id>scala</id>
|
|
||||||
<goals>
|
|
||||||
<goal>install-file</goal>
|
|
||||||
</goals>
|
|
||||||
<phase>prepare-package</phase>
|
|
||||||
<configuration>
|
|
||||||
<file>dependencies/Scala/lib/scala-plugin.jar</file>
|
|
||||||
<artifactId>scala-plugin</artifactId>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
</executions>
|
|
||||||
<configuration>
|
|
||||||
<localRepositoryPath>dependencies/maven</localRepositoryPath>
|
|
||||||
<groupId>org.teavm.idea</groupId>
|
|
||||||
<version>${idea.version}</version>
|
|
||||||
<packaging>jar</packaging>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
</plugins>
|
|
||||||
</build>
|
|
||||||
</project>
|
|
|
@ -1,95 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
~ Copyright 2017 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.
|
|
||||||
-->
|
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<parent>
|
|
||||||
<groupId>org.teavm</groupId>
|
|
||||||
<artifactId>teavm-idea-parent</artifactId>
|
|
||||||
<version>0.7.0-SNAPSHOT</version>
|
|
||||||
<relativePath>../pom.xml</relativePath>
|
|
||||||
</parent>
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
|
|
||||||
<artifactId>teavm-idea-artifacts</artifactId>
|
|
||||||
<name>TeaVM IDEA artifacts</name>
|
|
||||||
<packaging>pom</packaging>
|
|
||||||
|
|
||||||
<profiles>
|
|
||||||
<profile>
|
|
||||||
<id>download-dependencies</id>
|
|
||||||
<activation>
|
|
||||||
<activeByDefault>true</activeByDefault>
|
|
||||||
</activation>
|
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm</groupId>
|
|
||||||
<artifactId>teavm-tooling</artifactId>
|
|
||||||
<version>${project.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm</groupId>
|
|
||||||
<artifactId>teavm-devserver</artifactId>
|
|
||||||
<version>${project.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm</groupId>
|
|
||||||
<artifactId>teavm-classlib</artifactId>
|
|
||||||
<version>${project.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm</groupId>
|
|
||||||
<artifactId>teavm-chrome-rdp</artifactId>
|
|
||||||
<version>${project.version}</version>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
<build>
|
|
||||||
<plugins>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.codehaus.mojo</groupId>
|
|
||||||
<artifactId>exec-maven-plugin</artifactId>
|
|
||||||
<executions>
|
|
||||||
<execution>
|
|
||||||
<id>copy-dependencies</id>
|
|
||||||
<phase>initialize</phase>
|
|
||||||
<goals>
|
|
||||||
<goal>exec</goal>
|
|
||||||
</goals>
|
|
||||||
<configuration>
|
|
||||||
<executable>mvn</executable>
|
|
||||||
<arguments>
|
|
||||||
<item>-f</item>
|
|
||||||
<item>dep-pom.xml</item>
|
|
||||||
<item>install</item>
|
|
||||||
<item>-Didea.version=${idea.version}</item>
|
|
||||||
<item>-Dteavm.version=${project.version}</item>
|
|
||||||
<item>-Dmaven.repo.local=${settings.localRepository}</item>
|
|
||||||
<item>-B</item>
|
|
||||||
<item>-e</item>
|
|
||||||
</arguments>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
</executions>
|
|
||||||
</plugin>
|
|
||||||
</plugins>
|
|
||||||
</build>
|
|
||||||
</profile>
|
|
||||||
</profiles>
|
|
||||||
</project>
|
|
|
@ -1,12 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
|
|
||||||
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_5">
|
|
||||||
<output url="file://$MODULE_DIR$/target/classes" />
|
|
||||||
<output-test url="file://$MODULE_DIR$/target/test-classes" />
|
|
||||||
<content url="file://$MODULE_DIR$">
|
|
||||||
<excludeFolder url="file://$MODULE_DIR$/target" />
|
|
||||||
</content>
|
|
||||||
<orderEntry type="inheritedJdk" />
|
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
|
||||||
</component>
|
|
||||||
</module>
|
|
1
tools/idea/jps-common/.gitignore
vendored
1
tools/idea/jps-common/.gitignore
vendored
|
@ -1 +0,0 @@
|
||||||
lib/
|
|
|
@ -1,113 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
~ Copyright 2017 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.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<parent>
|
|
||||||
<artifactId>teavm-idea-parent</artifactId>
|
|
||||||
<groupId>org.teavm</groupId>
|
|
||||||
<version>0.7.0-SNAPSHOT</version>
|
|
||||||
<relativePath>../pom.xml</relativePath>
|
|
||||||
</parent>
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
|
|
||||||
<artifactId>teavm-jps-common</artifactId>
|
|
||||||
<name>TeaVM IDEA JPS common artifact</name>
|
|
||||||
|
|
||||||
<properties>
|
|
||||||
<idea.artifacts.dir>${basedir}/..</idea.artifacts.dir>
|
|
||||||
</properties>
|
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm</groupId>
|
|
||||||
<artifactId>teavm-idea-artifacts</artifactId>
|
|
||||||
<version>${project.version}</version>
|
|
||||||
<type>pom</type>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm.idea</groupId>
|
|
||||||
<artifactId>openapi</artifactId>
|
|
||||||
<version>${idea.version}</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm.idea</groupId>
|
|
||||||
<artifactId>annotations</artifactId>
|
|
||||||
<version>${idea.version}</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm.idea</groupId>
|
|
||||||
<artifactId>jdom</artifactId>
|
|
||||||
<version>${idea.version}</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm.idea</groupId>
|
|
||||||
<artifactId>util</artifactId>
|
|
||||||
<version>${idea.version}</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm.idea</groupId>
|
|
||||||
<artifactId>jps-model</artifactId>
|
|
||||||
<version>${idea.version}</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm.idea</groupId>
|
|
||||||
<artifactId>platform-api</artifactId>
|
|
||||||
<version>${idea.version}</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm.idea</groupId>
|
|
||||||
<artifactId>jps-builders</artifactId>
|
|
||||||
<version>${idea.version}</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm.idea</groupId>
|
|
||||||
<artifactId>jps-builders-6</artifactId>
|
|
||||||
<version>${idea.version}</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm.idea</groupId>
|
|
||||||
<artifactId>teavm</artifactId>
|
|
||||||
<version>${project.version}</version>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
<build>
|
|
||||||
<plugins>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-checkstyle-plugin</artifactId>
|
|
||||||
<configuration>
|
|
||||||
<configLocation>../../checkstyle.xml</configLocation>
|
|
||||||
<propertyExpansion>config_loc=${basedir}/../../../</propertyExpansion>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
</plugins>
|
|
||||||
</build>
|
|
||||||
|
|
||||||
</project>
|
|
|
@ -1,138 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.jps.model;
|
|
||||||
|
|
||||||
import com.intellij.util.xmlb.annotations.AbstractCollection;
|
|
||||||
import com.intellij.util.xmlb.annotations.Tag;
|
|
||||||
import com.intellij.util.xmlb.annotations.Transient;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.jetbrains.jps.model.JpsElementChildRole;
|
|
||||||
import org.jetbrains.jps.model.ex.JpsElementBase;
|
|
||||||
import org.jetbrains.jps.model.ex.JpsElementChildRoleBase;
|
|
||||||
import org.jetbrains.jps.model.module.JpsModule;
|
|
||||||
import org.teavm.tooling.TeaVMTargetType;
|
|
||||||
|
|
||||||
public class TeaVMJpsConfiguration extends JpsElementBase<TeaVMJpsConfiguration> {
|
|
||||||
static final JpsElementChildRole<TeaVMJpsConfiguration> JS_ROLE = JpsElementChildRoleBase.create(
|
|
||||||
"TeaVM configuration (JS)");
|
|
||||||
|
|
||||||
static final JpsElementChildRole<TeaVMJpsConfiguration> WEBASSEMBLY_ROLE = JpsElementChildRoleBase.create(
|
|
||||||
"TeaVM configuration (WebAssembly)");
|
|
||||||
|
|
||||||
@Transient
|
|
||||||
private TeaVMTargetType targetType;
|
|
||||||
|
|
||||||
private boolean skipped;
|
|
||||||
private String mainClass;
|
|
||||||
private String targetDirectory;
|
|
||||||
private boolean sourceMapsFileGenerated = true;
|
|
||||||
private boolean sourceFilesCopied = true;
|
|
||||||
private List<TeaVMProperty> properties = new ArrayList<>();
|
|
||||||
|
|
||||||
public boolean isSkipped() {
|
|
||||||
return skipped;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSkipped(boolean skipped) {
|
|
||||||
this.skipped = skipped;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TeaVMTargetType getTargetType() {
|
|
||||||
return targetType;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setTargetType(TeaVMTargetType targetType) {
|
|
||||||
this.targetType = targetType;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getMainClass() {
|
|
||||||
return mainClass;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setMainClass(String mainClass) {
|
|
||||||
this.mainClass = mainClass;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getTargetDirectory() {
|
|
||||||
return targetDirectory;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setTargetDirectory(String targetDirectory) {
|
|
||||||
this.targetDirectory = targetDirectory;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isSourceMapsFileGenerated() {
|
|
||||||
return sourceMapsFileGenerated;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSourceMapsFileGenerated(boolean sourceMapsFileGenerated) {
|
|
||||||
this.sourceMapsFileGenerated = sourceMapsFileGenerated;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isSourceFilesCopied() {
|
|
||||||
return sourceFilesCopied;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSourceFilesCopied(boolean sourceFilesCopied) {
|
|
||||||
this.sourceFilesCopied = sourceFilesCopied;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Tag("properties")
|
|
||||||
@AbstractCollection(surroundWithTag = false)
|
|
||||||
public List<TeaVMProperty> getProperties() {
|
|
||||||
return properties;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setProperties(List<TeaVMProperty> properties) {
|
|
||||||
this.properties = properties;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static List<TeaVMJpsConfiguration> getAll(JpsModule module) {
|
|
||||||
List<TeaVMJpsConfiguration> configurations = new ArrayList<>();
|
|
||||||
for (JpsElementChildRole<TeaVMJpsConfiguration> role : Arrays.asList(JS_ROLE, WEBASSEMBLY_ROLE)) {
|
|
||||||
TeaVMJpsConfiguration configuration = module.getContainer().getChild(role);
|
|
||||||
if (configuration != null) {
|
|
||||||
configurations.add(configuration);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return configurations;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public TeaVMJpsConfiguration createCopy() {
|
|
||||||
TeaVMJpsConfiguration copy = new TeaVMJpsConfiguration();
|
|
||||||
copy.applyChanges(this);
|
|
||||||
return copy;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void applyChanges(@NotNull TeaVMJpsConfiguration modified) {
|
|
||||||
mainClass = modified.mainClass;
|
|
||||||
targetDirectory = modified.targetDirectory;
|
|
||||||
sourceMapsFileGenerated = modified.sourceMapsFileGenerated;
|
|
||||||
sourceFilesCopied = modified.sourceFilesCopied;
|
|
||||||
|
|
||||||
properties.clear();
|
|
||||||
properties.addAll(modified.properties.stream()
|
|
||||||
.map(property -> property.createCopy())
|
|
||||||
.collect(Collectors.toList()));
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,64 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2017 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.jps.model;
|
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.jetbrains.jps.model.ex.JpsElementBase;
|
|
||||||
|
|
||||||
public class TeaVMJpsWorkspaceConfiguration extends JpsElementBase<TeaVMJpsWorkspaceConfiguration> {
|
|
||||||
private boolean daemonEnabled;
|
|
||||||
private int daemonMemory = 1024;
|
|
||||||
private boolean incremental;
|
|
||||||
|
|
||||||
public boolean isDaemonEnabled() {
|
|
||||||
return daemonEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDaemonEnabled(boolean daemonEnabled) {
|
|
||||||
this.daemonEnabled = daemonEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isIncremental() {
|
|
||||||
return incremental;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setIncremental(boolean incremental) {
|
|
||||||
this.incremental = incremental;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getDaemonMemory() {
|
|
||||||
return daemonMemory;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDaemonMemory(int daemonMemory) {
|
|
||||||
this.daemonMemory = daemonMemory;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public TeaVMJpsWorkspaceConfiguration createCopy() {
|
|
||||||
TeaVMJpsWorkspaceConfiguration copy = new TeaVMJpsWorkspaceConfiguration();
|
|
||||||
copy.applyChanges(this);
|
|
||||||
return copy;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void applyChanges(@NotNull TeaVMJpsWorkspaceConfiguration configuration) {
|
|
||||||
daemonEnabled = configuration.daemonEnabled;
|
|
||||||
incremental = configuration.incremental;
|
|
||||||
daemonMemory = configuration.daemonMemory;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,66 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.jps.model;
|
|
||||||
|
|
||||||
import com.intellij.util.xmlb.XmlSerializer;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
import org.jdom.Element;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
import org.jetbrains.jps.model.JpsElement;
|
|
||||||
import org.jetbrains.jps.model.JpsElementChildRole;
|
|
||||||
import org.jetbrains.jps.model.module.JpsModule;
|
|
||||||
import org.jetbrains.jps.model.serialization.JpsModelSerializerExtension;
|
|
||||||
import org.jetbrains.jps.model.serialization.facet.JpsFacetConfigurationSerializer;
|
|
||||||
import org.teavm.tooling.TeaVMTargetType;
|
|
||||||
|
|
||||||
public class TeaVMModelSerializerService extends JpsModelSerializerExtension {
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public List<? extends JpsFacetConfigurationSerializer<?>> getFacetConfigurationSerializers() {
|
|
||||||
return Arrays.asList(jsSerializer, wasmSerializer);
|
|
||||||
}
|
|
||||||
|
|
||||||
private TeaVMFacetSerializer jsSerializer = new TeaVMFacetSerializer(TeaVMJpsConfiguration.JS_ROLE,
|
|
||||||
"teavm-js", "TeaVM (JS)", TeaVMTargetType.JAVASCRIPT);
|
|
||||||
|
|
||||||
private TeaVMFacetSerializer wasmSerializer = new TeaVMFacetSerializer(TeaVMJpsConfiguration.WEBASSEMBLY_ROLE,
|
|
||||||
"teavm-wasm", "TeaVM (WebAssembly)", TeaVMTargetType.WEBASSEMBLY);
|
|
||||||
|
|
||||||
private class TeaVMFacetSerializer
|
|
||||||
extends JpsFacetConfigurationSerializer<TeaVMJpsConfiguration> {
|
|
||||||
private TeaVMTargetType targetType;
|
|
||||||
|
|
||||||
public TeaVMFacetSerializer(JpsElementChildRole<TeaVMJpsConfiguration> role, String facetTypeId,
|
|
||||||
@Nullable String facetName, TeaVMTargetType targetType) {
|
|
||||||
super(role, facetTypeId, facetName);
|
|
||||||
this.targetType = targetType;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected TeaVMJpsConfiguration loadExtension(@NotNull Element element, String s, JpsElement jpsElement,
|
|
||||||
JpsModule jpsModule) {
|
|
||||||
TeaVMJpsConfiguration configuration = XmlSerializer.deserialize(element, TeaVMJpsConfiguration.class);
|
|
||||||
configuration.setTargetType(targetType);
|
|
||||||
return configuration;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void saveExtension(TeaVMJpsConfiguration configuration, Element element, JpsModule jpsModule) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,50 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2017 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.jps.model;
|
|
||||||
|
|
||||||
import com.intellij.util.xmlb.annotations.Attribute;
|
|
||||||
import com.intellij.util.xmlb.annotations.Tag;
|
|
||||||
|
|
||||||
@Tag("property")
|
|
||||||
public class TeaVMProperty {
|
|
||||||
private String key = "";
|
|
||||||
private String value = "";
|
|
||||||
|
|
||||||
@Attribute("key")
|
|
||||||
public String getKey() {
|
|
||||||
return key;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setKey(String key) {
|
|
||||||
this.key = key;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Attribute("value")
|
|
||||||
public String getValue() {
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setValue(String value) {
|
|
||||||
this.value = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TeaVMProperty createCopy() {
|
|
||||||
TeaVMProperty copy = new TeaVMProperty();
|
|
||||||
copy.key = key;
|
|
||||||
copy.value = value;
|
|
||||||
return copy;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,27 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.jps.remote;
|
|
||||||
|
|
||||||
import java.rmi.Remote;
|
|
||||||
import java.rmi.RemoteException;
|
|
||||||
|
|
||||||
public interface TeaVMBuilderAssistant extends Remote {
|
|
||||||
String REMOTE_PORT = "teavm.jps.remote-port";
|
|
||||||
String ID = "TeaVM-JPS-Assistant";
|
|
||||||
|
|
||||||
TeaVMElementLocation getMethodLocation(String className, String methodName, String methodDesc)
|
|
||||||
throws RemoteException;
|
|
||||||
}
|
|
|
@ -1,54 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.jps.remote;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
|
||||||
|
|
||||||
public class TeaVMElementLocation implements Serializable {
|
|
||||||
private int startOffset;
|
|
||||||
private int endOffset;
|
|
||||||
private int line;
|
|
||||||
private int column;
|
|
||||||
private String path;
|
|
||||||
|
|
||||||
public TeaVMElementLocation(int startOffset, int endOffset, int line, int column, String path) {
|
|
||||||
this.startOffset = startOffset;
|
|
||||||
this.endOffset = endOffset;
|
|
||||||
this.line = line;
|
|
||||||
this.column = column;
|
|
||||||
this.path = path;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getStartOffset() {
|
|
||||||
return startOffset;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getEndOffset() {
|
|
||||||
return endOffset;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getLine() {
|
|
||||||
return line;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getColumn() {
|
|
||||||
return column;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getPath() {
|
|
||||||
return path;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,26 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
|
|
||||||
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
|
|
||||||
<output url="file://$MODULE_DIR$/target/classes" />
|
|
||||||
<output-test url="file://$MODULE_DIR$/target/test-classes" />
|
|
||||||
<content url="file://$MODULE_DIR$">
|
|
||||||
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
|
|
||||||
<excludeFolder url="file://$MODULE_DIR$/target" />
|
|
||||||
</content>
|
|
||||||
<orderEntry type="jdk" jdkName="IntelliJ IDEA" jdkType="IDEA JDK" />
|
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
|
||||||
<orderEntry type="module-library">
|
|
||||||
<library>
|
|
||||||
<CLASSES>
|
|
||||||
<root url="jar://$MODULE_DIR$/../idea-artifacts/dependencies/teavm.jar!/" />
|
|
||||||
</CLASSES>
|
|
||||||
<JAVADOC />
|
|
||||||
<SOURCES />
|
|
||||||
</library>
|
|
||||||
</orderEntry>
|
|
||||||
</component>
|
|
||||||
<component name="teavm">
|
|
||||||
<option name="mainClass" value="" />
|
|
||||||
<option name="targetDirectory" value="" />
|
|
||||||
</component>
|
|
||||||
</module>
|
|
|
@ -1,107 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
~ Copyright 2017 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.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<parent>
|
|
||||||
<artifactId>teavm-idea-parent</artifactId>
|
|
||||||
<groupId>org.teavm</groupId>
|
|
||||||
<version>0.7.0-SNAPSHOT</version>
|
|
||||||
<relativePath>../pom.xml</relativePath>
|
|
||||||
</parent>
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
|
|
||||||
<artifactId>teavm-jps-plugin</artifactId>
|
|
||||||
<name>TeaVM IDEA JPS plugin</name>
|
|
||||||
|
|
||||||
<properties>
|
|
||||||
<idea.artifacts.dir>${basedir}/..</idea.artifacts.dir>
|
|
||||||
</properties>
|
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm.idea</groupId>
|
|
||||||
<artifactId>openapi</artifactId>
|
|
||||||
<version>${idea.version}</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm.idea</groupId>
|
|
||||||
<artifactId>annotations</artifactId>
|
|
||||||
<version>${idea.version}</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm.idea</groupId>
|
|
||||||
<artifactId>util</artifactId>
|
|
||||||
<version>${idea.version}</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm.idea</groupId>
|
|
||||||
<artifactId>jdom</artifactId>
|
|
||||||
<version>${idea.version}</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm.idea</groupId>
|
|
||||||
<artifactId>jps-model</artifactId>
|
|
||||||
<version>${idea.version}</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm.idea</groupId>
|
|
||||||
<artifactId>platform-api</artifactId>
|
|
||||||
<version>${idea.version}</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm.idea</groupId>
|
|
||||||
<artifactId>jps-builders</artifactId>
|
|
||||||
<version>${idea.version}</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm.idea</groupId>
|
|
||||||
<artifactId>jps-builders-6</artifactId>
|
|
||||||
<version>${idea.version}</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm</groupId>
|
|
||||||
<artifactId>teavm-jps-common</artifactId>
|
|
||||||
<version>${project.version}</version>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
<build>
|
|
||||||
<plugins>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-checkstyle-plugin</artifactId>
|
|
||||||
<configuration>
|
|
||||||
<configLocation>../../checkstyle.xml</configLocation>
|
|
||||||
<propertyExpansion>config_loc=${basedir}/../../../</propertyExpansion>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
</plugins>
|
|
||||||
</build>
|
|
||||||
|
|
||||||
</project>
|
|
|
@ -1,71 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2018 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.jps;
|
|
||||||
|
|
||||||
import java.io.BufferedInputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.net.URL;
|
|
||||||
import java.net.URLClassLoader;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
import org.teavm.asm.ClassReader;
|
|
||||||
import org.teavm.asm.ClassWriter;
|
|
||||||
|
|
||||||
public class RenamingClassLoader extends URLClassLoader {
|
|
||||||
private List<Rename> renameList = new ArrayList<>();
|
|
||||||
|
|
||||||
public RenamingClassLoader(URL[] urls, ClassLoader parent) {
|
|
||||||
super(urls, parent);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void rename(String prefix, String to) {
|
|
||||||
renameList.add(new Rename(prefix, to));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Class<?> findClass(String name) throws ClassNotFoundException {
|
|
||||||
try {
|
|
||||||
return getParent().loadClass(name);
|
|
||||||
} catch (ClassNotFoundException e) {
|
|
||||||
// continue
|
|
||||||
}
|
|
||||||
|
|
||||||
try (InputStream input = getResourceAsStream(name.replace('.', '/') + ".class")) {
|
|
||||||
ClassReader classReader = new ClassReader(new BufferedInputStream(input));
|
|
||||||
ClassWriter writer = new ClassWriter(0);
|
|
||||||
RenamingVisitor visitor = new RenamingVisitor(writer);
|
|
||||||
for (Rename rename : renameList) {
|
|
||||||
visitor.rename(rename.prefix, rename.to);
|
|
||||||
}
|
|
||||||
classReader.accept(visitor, 0);
|
|
||||||
byte[] data = writer.toByteArray();
|
|
||||||
return defineClass(name, data, 0, data.length);
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new ClassNotFoundException(name, e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static class Rename {
|
|
||||||
final String prefix;
|
|
||||||
final String to;
|
|
||||||
|
|
||||||
Rename(String prefix, String to) {
|
|
||||||
this.prefix = prefix;
|
|
||||||
this.to = to;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,287 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2018 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.jps;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
import org.teavm.asm.AnnotationVisitor;
|
|
||||||
import org.teavm.asm.ClassVisitor;
|
|
||||||
import org.teavm.asm.FieldVisitor;
|
|
||||||
import org.teavm.asm.Handle;
|
|
||||||
import org.teavm.asm.Label;
|
|
||||||
import org.teavm.asm.MethodVisitor;
|
|
||||||
import org.teavm.asm.Opcodes;
|
|
||||||
import org.teavm.asm.Type;
|
|
||||||
import org.teavm.asm.TypePath;
|
|
||||||
|
|
||||||
public class RenamingVisitor extends ClassVisitor {
|
|
||||||
private List<Rename> renameList = new ArrayList<>();
|
|
||||||
|
|
||||||
public RenamingVisitor(ClassVisitor inner) {
|
|
||||||
super(Opcodes.ASM5, inner);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void rename(String prefix, String newName) {
|
|
||||||
renameList.add(new Rename(prefix, newName));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
|
|
||||||
for (int i = 0; i < interfaces.length; ++i) {
|
|
||||||
interfaces[i] = renameClass(interfaces[i]);
|
|
||||||
}
|
|
||||||
super.visit(version, access, name, signature, renameClass(superName), interfaces);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
|
|
||||||
desc = renameValueDesc(desc);
|
|
||||||
return new RenamingAnnotationVisitor(super.visitAnnotation(desc, visible));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public AnnotationVisitor visitTypeAnnotation(int typeRef, TypePath typePath, String desc, boolean visible) {
|
|
||||||
desc = renameValueDesc(desc);
|
|
||||||
return new RenamingAnnotationVisitor(super.visitTypeAnnotation(typeRef, typePath, desc, visible));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
|
|
||||||
desc = renameMethodDesc(desc);
|
|
||||||
return new RenamingMethodVisitor(super.visitMethod(access, name, desc, signature, exceptions));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) {
|
|
||||||
return new RenamingFieldVisitor(super.visitField(access, name, renameValueDesc(desc), signature, value));
|
|
||||||
}
|
|
||||||
|
|
||||||
class RenamingMethodVisitor extends MethodVisitor {
|
|
||||||
RenamingMethodVisitor(MethodVisitor inner) {
|
|
||||||
super(Opcodes.ASM5, inner);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public AnnotationVisitor visitLocalVariableAnnotation(int typeRef, TypePath typePath, Label[] start,
|
|
||||||
Label[] end, int[] index, String desc, boolean visible) {
|
|
||||||
desc = renameValueDesc(desc);
|
|
||||||
return new RenamingAnnotationVisitor(super.visitLocalVariableAnnotation(typeRef, typePath,
|
|
||||||
start, end, index, desc, visible));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
|
|
||||||
return new RenamingAnnotationVisitor(super.visitAnnotation(desc, visible));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public AnnotationVisitor visitAnnotationDefault() {
|
|
||||||
return new RenamingAnnotationVisitor(super.visitAnnotationDefault());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public AnnotationVisitor visitInsnAnnotation(int typeRef, TypePath typePath, String desc, boolean visible) {
|
|
||||||
desc = renameValueDesc(desc);
|
|
||||||
return new RenamingAnnotationVisitor(super.visitInsnAnnotation(typeRef, typePath, desc, visible));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public AnnotationVisitor visitParameterAnnotation(int parameter, String desc, boolean visible) {
|
|
||||||
desc = renameValueDesc(desc);
|
|
||||||
return new RenamingAnnotationVisitor(super.visitParameterAnnotation(parameter, desc, visible));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public AnnotationVisitor visitTryCatchAnnotation(int typeRef, TypePath typePath, String desc, boolean visible) {
|
|
||||||
desc = renameValueDesc(desc);
|
|
||||||
return new RenamingAnnotationVisitor(super.visitTryCatchAnnotation(typeRef, typePath, desc, visible));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public AnnotationVisitor visitTypeAnnotation(int typeRef, TypePath typePath, String desc, boolean visible) {
|
|
||||||
desc = renameValueDesc(desc);
|
|
||||||
return new RenamingAnnotationVisitor(super.visitTypeAnnotation(typeRef, typePath, desc, visible));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visitFieldInsn(int opcode, String owner, String name, String desc) {
|
|
||||||
owner = renameClass(owner);
|
|
||||||
desc = renameValueDesc(desc);
|
|
||||||
super.visitFieldInsn(opcode, owner, name, desc);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visitLdcInsn(Object cst) {
|
|
||||||
if (cst instanceof Type) {
|
|
||||||
cst = Type.getType(renameType((Type) cst));
|
|
||||||
}
|
|
||||||
super.visitLdcInsn(cst);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index) {
|
|
||||||
desc = renameValueDesc(desc);
|
|
||||||
super.visitLocalVariable(name, desc, signature, start, end, index);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) {
|
|
||||||
owner = renameClass(owner);
|
|
||||||
desc = renameMethodDesc(desc);
|
|
||||||
super.visitMethodInsn(opcode, owner, name, desc, itf);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visitTypeInsn(int opcode, String type) {
|
|
||||||
if (type.startsWith("[")) {
|
|
||||||
type = renameValueDesc(type);
|
|
||||||
} else {
|
|
||||||
type = renameClass(type);
|
|
||||||
}
|
|
||||||
super.visitTypeInsn(opcode, type);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visitTryCatchBlock(Label start, Label end, Label handler, String type) {
|
|
||||||
type = renameClass(type);
|
|
||||||
super.visitTryCatchBlock(start, end, handler, type);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visitFrame(int type, int nLocal, Object[] local, int nStack, Object[] stack) {
|
|
||||||
for (int i = 0; i < local.length; ++i) {
|
|
||||||
if (local[i] instanceof String) {
|
|
||||||
local[i] = renameClass((String) local[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (int i = 0; i < stack.length; ++i) {
|
|
||||||
if (stack[i] instanceof String) {
|
|
||||||
stack[i] = renameClass((String) stack[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
super.visitFrame(type, nLocal, local, nStack, stack);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) {
|
|
||||||
desc = renameMethodDesc(desc);
|
|
||||||
bsm = renameHandle(bsm);
|
|
||||||
for (int i = 0; i < bsmArgs.length; ++i) {
|
|
||||||
Object arg = bsmArgs[i];
|
|
||||||
if (arg instanceof Type) {
|
|
||||||
arg = Type.getType(renameType((Type) arg));
|
|
||||||
} else if (arg instanceof Handle) {
|
|
||||||
arg = renameHandle((Handle) arg);
|
|
||||||
}
|
|
||||||
bsmArgs[i] = arg;
|
|
||||||
}
|
|
||||||
super.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class RenamingFieldVisitor extends FieldVisitor {
|
|
||||||
RenamingFieldVisitor(FieldVisitor inner) {
|
|
||||||
super(Opcodes.ASM5, inner);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
|
|
||||||
desc = renameValueDesc(desc);
|
|
||||||
return new RenamingAnnotationVisitor(super.visitAnnotation(desc, visible));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public AnnotationVisitor visitTypeAnnotation(int typeRef, TypePath typePath, String desc, boolean visible) {
|
|
||||||
desc = renameValueDesc(desc);
|
|
||||||
return new RenamingAnnotationVisitor(super.visitTypeAnnotation(typeRef, typePath, desc, visible));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class RenamingAnnotationVisitor extends AnnotationVisitor {
|
|
||||||
RenamingAnnotationVisitor(AnnotationVisitor inner) {
|
|
||||||
super(Opcodes.ASM5, inner);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public AnnotationVisitor visitArray(String name) {
|
|
||||||
return new RenamingAnnotationVisitor(super.visitArray(name));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public AnnotationVisitor visitAnnotation(String name, String desc) {
|
|
||||||
desc = renameValueDesc(desc);
|
|
||||||
return new RenamingAnnotationVisitor(super.visitAnnotation(name, desc));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visitEnum(String name, String desc, String value) {
|
|
||||||
desc = renameValueDesc(desc);
|
|
||||||
super.visitEnum(name, desc, value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private String renameClass(String className) {
|
|
||||||
if (className == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
for (Rename rename : renameList) {
|
|
||||||
if (className.startsWith(rename.prefix)) {
|
|
||||||
return rename.renameTo + className.substring(rename.prefix.length());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return className;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Handle renameHandle(Handle handle) {
|
|
||||||
String desc = handle.getDesc();
|
|
||||||
desc = desc.startsWith("(") ? renameMethodDesc(desc) : renameValueDesc(desc);
|
|
||||||
return new Handle(handle.getTag(), renameClass(handle.getOwner()), handle.getName(), desc);
|
|
||||||
}
|
|
||||||
|
|
||||||
private String renameValueDesc(String desc) {
|
|
||||||
return renameType(Type.getType(desc));
|
|
||||||
}
|
|
||||||
|
|
||||||
private String renameMethodDesc(String desc) {
|
|
||||||
return renameType(Type.getMethodType(desc));
|
|
||||||
}
|
|
||||||
|
|
||||||
private String renameType(Type type) {
|
|
||||||
switch (type.getSort()) {
|
|
||||||
case Type.ARRAY:
|
|
||||||
return "[" + renameValueDesc(type.getDescriptor().substring(1));
|
|
||||||
case Type.METHOD:
|
|
||||||
return "(" + Arrays.stream(type.getArgumentTypes()).map(this::renameType)
|
|
||||||
.collect(Collectors.joining("")) + ")" + renameType(type.getReturnType());
|
|
||||||
case Type.OBJECT:
|
|
||||||
return "L" + renameClass(type.getInternalName()) + ";";
|
|
||||||
default:
|
|
||||||
return type.getDescriptor();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static class Rename {
|
|
||||||
final String prefix;
|
|
||||||
final String renameTo;
|
|
||||||
|
|
||||||
Rename(String prefix, String renameTo) {
|
|
||||||
this.prefix = prefix;
|
|
||||||
this.renameTo = renameTo;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,546 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.jps;
|
|
||||||
|
|
||||||
import static java.util.stream.Collectors.toList;
|
|
||||||
import static java.util.stream.Collectors.toSet;
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileInputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStreamReader;
|
|
||||||
import java.io.Reader;
|
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
import java.util.ArrayDeque;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.Properties;
|
|
||||||
import java.util.Queue;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.stream.Stream;
|
|
||||||
import org.jetbrains.jps.builders.BuildOutputConsumer;
|
|
||||||
import org.jetbrains.jps.incremental.CompileContext;
|
|
||||||
import org.jetbrains.jps.incremental.messages.BuildMessage;
|
|
||||||
import org.jetbrains.jps.incremental.messages.CompilerMessage;
|
|
||||||
import org.jetbrains.jps.incremental.messages.ProgressMessage;
|
|
||||||
import org.jetbrains.jps.model.JpsProject;
|
|
||||||
import org.jetbrains.jps.model.java.JpsJavaExtensionService;
|
|
||||||
import org.jetbrains.jps.model.library.JpsLibrary;
|
|
||||||
import org.jetbrains.jps.model.library.JpsLibraryRoot;
|
|
||||||
import org.jetbrains.jps.model.library.JpsOrderRootType;
|
|
||||||
import org.jetbrains.jps.model.module.JpsDependencyElement;
|
|
||||||
import org.jetbrains.jps.model.module.JpsLibraryDependency;
|
|
||||||
import org.jetbrains.jps.model.module.JpsModule;
|
|
||||||
import org.jetbrains.jps.model.module.JpsModuleDependency;
|
|
||||||
import org.jetbrains.jps.model.module.JpsModuleSourceRoot;
|
|
||||||
import org.teavm.callgraph.CallGraph;
|
|
||||||
import org.teavm.callgraph.CallGraphNode;
|
|
||||||
import org.teavm.callgraph.CallSite;
|
|
||||||
import org.teavm.common.IntegerArray;
|
|
||||||
import org.teavm.diagnostics.DefaultProblemTextConsumer;
|
|
||||||
import org.teavm.diagnostics.Problem;
|
|
||||||
import org.teavm.diagnostics.ProblemProvider;
|
|
||||||
import org.teavm.idea.jps.model.TeaVMJpsConfiguration;
|
|
||||||
import org.teavm.idea.jps.model.TeaVMProperty;
|
|
||||||
import org.teavm.idea.jps.remote.TeaVMBuilderAssistant;
|
|
||||||
import org.teavm.idea.jps.remote.TeaVMElementLocation;
|
|
||||||
import org.teavm.model.CallLocation;
|
|
||||||
import org.teavm.model.MethodReference;
|
|
||||||
import org.teavm.model.TextLocation;
|
|
||||||
import org.teavm.model.ValueType;
|
|
||||||
import org.teavm.tooling.builder.BuildException;
|
|
||||||
import org.teavm.tooling.builder.BuildResult;
|
|
||||||
import org.teavm.tooling.builder.BuildStrategy;
|
|
||||||
import org.teavm.vm.TeaVMPhase;
|
|
||||||
import org.teavm.vm.TeaVMProgressFeedback;
|
|
||||||
import org.teavm.vm.TeaVMProgressListener;
|
|
||||||
|
|
||||||
class TeaVMBuild {
|
|
||||||
private static final String[] BLACKLISTED_CLASSES = {
|
|
||||||
"org/teavm/jso/impl/JSOPlugin.class",
|
|
||||||
"org/teavm/metaprogramming/impl/MetaprogrammingImpl.class",
|
|
||||||
"org/teavm/classlib/impl/JCLPlugin.class"
|
|
||||||
};
|
|
||||||
|
|
||||||
private final CompileContext context;
|
|
||||||
private final List<String> classPathEntries = new ArrayList<>();
|
|
||||||
private List<String> directoryClassPathEntries;
|
|
||||||
private TeaVMStorage storage;
|
|
||||||
private final TeaVMBuilderAssistant assistant;
|
|
||||||
private final Map<String, File> sourceFileCache = new HashMap<>();
|
|
||||||
private final Map<File, int[]> fileLineCache = new HashMap<>();
|
|
||||||
private BuildStrategy buildStrategy;
|
|
||||||
private BuildOutputConsumer outputConsumer;
|
|
||||||
private boolean incrementaSupported;
|
|
||||||
|
|
||||||
TeaVMBuild(CompileContext context, TeaVMBuilderAssistant assistant, BuildStrategy buildStrategy,
|
|
||||||
BuildOutputConsumer outputConsumer, boolean incrementalSupported) {
|
|
||||||
this.context = context;
|
|
||||||
this.assistant = assistant;
|
|
||||||
this.buildStrategy = buildStrategy;
|
|
||||||
this.outputConsumer = outputConsumer;
|
|
||||||
this.incrementaSupported = incrementalSupported;
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean perform(JpsModule module, TeaVMBuildTarget target) throws IOException, BuildException {
|
|
||||||
TeaVMStorageProvider storageProvider = new TeaVMStorageProvider(
|
|
||||||
target.getConfiguration().getTargetType().name());
|
|
||||||
storage = context.getProjectDescriptor().dataManager.getStorage(target, storageProvider);
|
|
||||||
|
|
||||||
TeaVMJpsConfiguration config = target.getConfiguration();
|
|
||||||
if (config.isSkipped()) {
|
|
||||||
context.processMessage(new CompilerMessage("TeaVM", BuildMessage.Kind.INFO,
|
|
||||||
"TeaVM skipped due to facet configuration"));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
classPathEntries.clear();
|
|
||||||
buildStrategy.init();
|
|
||||||
buildClassPath(module);
|
|
||||||
directoryClassPathEntries = classPathEntries.stream().filter(name -> new File(name).isDirectory())
|
|
||||||
.collect(toList());
|
|
||||||
|
|
||||||
if (!hasChanges(target)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
buildStrategy.setClassPathEntries(classPathEntries);
|
|
||||||
buildStrategy.setDebugInformationGenerated(config.isSourceMapsFileGenerated());
|
|
||||||
buildStrategy.setSourceMapsFileGenerated(config.isSourceMapsFileGenerated());
|
|
||||||
buildStrategy.setSourceFilesCopied(config.isSourceFilesCopied());
|
|
||||||
buildStrategy.setMainClass(config.getMainClass());
|
|
||||||
buildStrategy.setTargetType(config.getTargetType());
|
|
||||||
buildStrategy.setTargetDirectory(config.getTargetDirectory());
|
|
||||||
buildStrategy.setProgressListener(createProgressListener(context));
|
|
||||||
buildStrategy.setIncremental(incrementaSupported && !isRebuild(target));
|
|
||||||
|
|
||||||
Properties properties = new Properties();
|
|
||||||
for (TeaVMProperty property : config.getProperties()) {
|
|
||||||
properties.put(property.getKey(), property.getValue());
|
|
||||||
}
|
|
||||||
buildStrategy.setProperties(properties);
|
|
||||||
|
|
||||||
BuildResult buildResult = buildStrategy.build();
|
|
||||||
|
|
||||||
if (!buildResult.getProblems().getSevereProblems().isEmpty()) {
|
|
||||||
updateStorage(buildResult);
|
|
||||||
}
|
|
||||||
|
|
||||||
reportProblems(buildResult.getProblems(), buildResult.getCallGraph());
|
|
||||||
|
|
||||||
for (String fileName : buildResult.getGeneratedFiles()) {
|
|
||||||
outputConsumer.registerOutputFile(new File(fileName), Collections.emptyList());
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private TeaVMProgressListener createProgressListener(CompileContext context) {
|
|
||||||
return new TeaVMProgressListener() {
|
|
||||||
private TeaVMPhase currentPhase;
|
|
||||||
int expectedCount;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TeaVMProgressFeedback phaseStarted(TeaVMPhase phase, int count) {
|
|
||||||
expectedCount = count;
|
|
||||||
context.processMessage(new ProgressMessage(phaseName(phase), 0));
|
|
||||||
currentPhase = phase;
|
|
||||||
return context.getCancelStatus().isCanceled() ? TeaVMProgressFeedback.CANCEL
|
|
||||||
: TeaVMProgressFeedback.CONTINUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TeaVMProgressFeedback progressReached(int progress) {
|
|
||||||
context.processMessage(new ProgressMessage(phaseName(currentPhase), (float) progress / expectedCount));
|
|
||||||
return context.getCancelStatus().isCanceled() ? TeaVMProgressFeedback.CANCEL
|
|
||||||
: TeaVMProgressFeedback.CONTINUE;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String phaseName(TeaVMPhase phase) {
|
|
||||||
switch (phase) {
|
|
||||||
case DEPENDENCY_ANALYSIS:
|
|
||||||
return "Discovering classes to compile";
|
|
||||||
case COMPILING:
|
|
||||||
return "Compiling";
|
|
||||||
default:
|
|
||||||
throw new AssertionError();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void reportProblems(ProblemProvider problemProvider, CallGraph callGraph) {
|
|
||||||
for (Problem problem : problemProvider.getProblems()) {
|
|
||||||
BuildMessage.Kind kind;
|
|
||||||
switch (problem.getSeverity()) {
|
|
||||||
case ERROR:
|
|
||||||
kind = BuildMessage.Kind.ERROR;
|
|
||||||
break;
|
|
||||||
case WARNING:
|
|
||||||
kind = BuildMessage.Kind.WARNING;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
DefaultProblemTextConsumer textConsumer = new DefaultProblemTextConsumer();
|
|
||||||
problem.render(textConsumer);
|
|
||||||
String baseText = textConsumer.getText();
|
|
||||||
|
|
||||||
List<ProblemToReport> problemsToReport = resolveProblemLocation(problem, callGraph);
|
|
||||||
|
|
||||||
if (problemsToReport.isEmpty()) {
|
|
||||||
context.processMessage(new CompilerMessage("TeaVM", kind, problem.getText(), null,
|
|
||||||
-1, -1, -1, -1, -1));
|
|
||||||
}
|
|
||||||
for (ProblemToReport problemToReport : problemsToReport) {
|
|
||||||
String text = baseText + buildCallStack(problemToReport.locations);
|
|
||||||
context.processMessage(new CompilerMessage("TeaVM", kind, text, problemToReport.path,
|
|
||||||
problemToReport.startOffset, problemToReport.endOffset, problemToReport.startOffset,
|
|
||||||
problemToReport.line, 0));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static class ProblemToReport {
|
|
||||||
int line;
|
|
||||||
int startOffset;
|
|
||||||
int endOffset;
|
|
||||||
String path;
|
|
||||||
CallLocationList locations;
|
|
||||||
}
|
|
||||||
|
|
||||||
static class CallLocationList {
|
|
||||||
final CallLocation value;
|
|
||||||
final CallLocationList next;
|
|
||||||
|
|
||||||
private CallLocationList(CallLocation value, CallLocationList next) {
|
|
||||||
this.value = value;
|
|
||||||
this.next = next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<ProblemToReport> resolveProblemLocation(Problem problem, CallGraph callGraph) {
|
|
||||||
class Step {
|
|
||||||
private final CallLocationList locationList;
|
|
||||||
private final CallLocation location;
|
|
||||||
|
|
||||||
private Step(CallLocationList locationList, CallLocation location) {
|
|
||||||
this.locationList = locationList;
|
|
||||||
this.location = location;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
List<ProblemToReport> problemsToReport = new ArrayList<>();
|
|
||||||
Set<MethodReference> visited = new HashSet<>();
|
|
||||||
Queue<Step> workList = new ArrayDeque<>();
|
|
||||||
workList.add(new Step(null, problem.getLocation()));
|
|
||||||
|
|
||||||
while (!workList.isEmpty()) {
|
|
||||||
Step step = workList.remove();
|
|
||||||
if (step.location == null || !visited.add(step.location.getMethod())) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
ProblemToReport result = getProblemLocation(step.location);
|
|
||||||
|
|
||||||
CallGraphNode node = callGraph.getNode(step.location.getMethod());
|
|
||||||
if (node.getCallerCallSites().isEmpty() || isValid(result)) {
|
|
||||||
result.locations = step.locationList;
|
|
||||||
problemsToReport.add(result);
|
|
||||||
} else {
|
|
||||||
for (CallSite callSite : node.getCallerCallSites()) {
|
|
||||||
for (CallGraphNode caller : callSite.getCallers()) {
|
|
||||||
CallLocation nextLocation = new CallLocation(caller.getMethod(),
|
|
||||||
getLocation(callSite.getLocations(caller)));
|
|
||||||
workList.add(new Step(new CallLocationList(step.location, step.locationList), nextLocation));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return problemsToReport;
|
|
||||||
}
|
|
||||||
|
|
||||||
private TextLocation getLocation(Collection<? extends TextLocation> location) {
|
|
||||||
return location.isEmpty() ? null : location.iterator().next();
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isValid(ProblemToReport problemToReport) {
|
|
||||||
return problemToReport.path != null && (problemToReport.line >= 0 || problemToReport.startOffset >= 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
private ProblemToReport getProblemLocation(CallLocation callLocation) {
|
|
||||||
String path = null;
|
|
||||||
File file = null;
|
|
||||||
int line = -1;
|
|
||||||
int startOffset = -1;
|
|
||||||
int endOffset = -1;
|
|
||||||
|
|
||||||
if (callLocation != null) {
|
|
||||||
TextLocation insnLocation = callLocation.getSourceLocation();
|
|
||||||
if (insnLocation != null) {
|
|
||||||
path = insnLocation.getFileName();
|
|
||||||
line = insnLocation.getLine();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (line <= 0 && assistant != null && callLocation.getMethod() != null) {
|
|
||||||
MethodReference method = callLocation.getMethod();
|
|
||||||
try {
|
|
||||||
TeaVMElementLocation location = assistant.getMethodLocation(method.getClassName(),
|
|
||||||
method.getName(), ValueType.methodTypeToString(method.getSignature()));
|
|
||||||
line = location.getLine();
|
|
||||||
startOffset = location.getStartOffset();
|
|
||||||
endOffset = location.getEndOffset();
|
|
||||||
file = new File(location.getPath());
|
|
||||||
|
|
||||||
if (line <= 0) {
|
|
||||||
int[] lines = getLineOffsets(file);
|
|
||||||
if (lines != null) {
|
|
||||||
line = Arrays.binarySearch(lines, startOffset + 1);
|
|
||||||
if (line < 0) {
|
|
||||||
line = -line - 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
// just don't fill location fields
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (file == null) {
|
|
||||||
if (path != null) {
|
|
||||||
file = lookupSource(path);
|
|
||||||
path = file != null ? file.getPath() : null;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
path = file.getPath();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (startOffset < 0 && file != null && line > 0) {
|
|
||||||
int[] lines = getLineOffsets(file);
|
|
||||||
if (lines != null && line < lines.length) {
|
|
||||||
startOffset = lines[line - 1];
|
|
||||||
endOffset = lines[line] - 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ProblemToReport result = new ProblemToReport();
|
|
||||||
result.line = line;
|
|
||||||
result.startOffset = startOffset;
|
|
||||||
result.endOffset = endOffset;
|
|
||||||
result.path = path;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String buildCallStack(CallLocationList callLocationList) {
|
|
||||||
List<CallLocation> locations = new ArrayList<>();
|
|
||||||
while (callLocationList != null) {
|
|
||||||
locations.add(callLocationList.value);
|
|
||||||
callLocationList = callLocationList.next;
|
|
||||||
}
|
|
||||||
Collections.reverse(locations);
|
|
||||||
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
for (CallLocation location : locations) {
|
|
||||||
sb.append("\n at ").append(location.getMethod());
|
|
||||||
if (location.getSourceLocation() != null) {
|
|
||||||
sb.append("(").append(location.getSourceLocation()).append(")");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
private File lookupSource(String relativePath) {
|
|
||||||
return sourceFileCache.computeIfAbsent(relativePath, this::lookupSourceCacheMiss);
|
|
||||||
}
|
|
||||||
|
|
||||||
private File lookupSourceCacheMiss(String relativePath) {
|
|
||||||
JpsProject project = context.getProjectDescriptor().getModel().getProject();
|
|
||||||
for (JpsModule module : project.getModules()) {
|
|
||||||
for (JpsModuleSourceRoot sourceRoot : module.getSourceRoots()) {
|
|
||||||
File fullPath = new File(sourceRoot.getFile(), relativePath);
|
|
||||||
if (fullPath.exists()) {
|
|
||||||
return fullPath;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private int[] getLineOffsets(File file) {
|
|
||||||
return fileLineCache.computeIfAbsent(file, this::getLineOffsetsCacheMiss);
|
|
||||||
}
|
|
||||||
|
|
||||||
private int[] getLineOffsetsCacheMiss(File file) {
|
|
||||||
IntegerArray lines = new IntegerArray(50);
|
|
||||||
try (Reader reader = new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8)) {
|
|
||||||
int offset = 0;
|
|
||||||
lines.add(0);
|
|
||||||
|
|
||||||
boolean expectingLf = false;
|
|
||||||
while (true) {
|
|
||||||
int c = reader.read();
|
|
||||||
if (c == -1) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (c == '\n') {
|
|
||||||
expectingLf = false;
|
|
||||||
lines.add(offset + 1);
|
|
||||||
} else {
|
|
||||||
if (expectingLf) {
|
|
||||||
expectingLf = false;
|
|
||||||
lines.add(offset);
|
|
||||||
}
|
|
||||||
if (c == '\r') {
|
|
||||||
lines.add(offset + 1);
|
|
||||||
expectingLf = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
++offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (expectingLf) {
|
|
||||||
lines.add(offset);
|
|
||||||
}
|
|
||||||
lines.add(offset + 1);
|
|
||||||
} catch (IOException e) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return lines.getAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isRebuild(TeaVMBuildTarget target) {
|
|
||||||
return !context.getScope().isBuildIncrementally(target.getTargetType())
|
|
||||||
|| context.getScope().isBuildForced(target);
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean hasChanges(TeaVMBuildTarget target) {
|
|
||||||
if (isRebuild(target)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
List<TeaVMStorage.Entry> filesToWatch = storage.getParticipatingFiles();
|
|
||||||
if (filesToWatch == null) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (TeaVMStorage.Entry fileToWatch : filesToWatch) {
|
|
||||||
Long actualTimestamp = getTimestamp(fileToWatch.path);
|
|
||||||
if (actualTimestamp == null || actualTimestamp > fileToWatch.timestamp) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateStorage(BuildResult buildResult) {
|
|
||||||
Set<String> resources = Stream.concat(buildResult.getClasses().stream()
|
|
||||||
.map(cls -> cls.replace('.', '/') + ".class"), buildResult.getUsedResources().stream())
|
|
||||||
.collect(toSet());
|
|
||||||
List<TeaVMStorage.Entry> participatingFiles = resources.stream()
|
|
||||||
.map(path -> {
|
|
||||||
Long timestamp = getTimestamp(path);
|
|
||||||
return timestamp != null ? new TeaVMStorage.Entry(path, timestamp) : null;
|
|
||||||
})
|
|
||||||
.filter(Objects::nonNull)
|
|
||||||
.collect(toList());
|
|
||||||
|
|
||||||
storage.setParticipatingFiles(participatingFiles);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Long getTimestamp(String path) {
|
|
||||||
for (String classPathEntry : directoryClassPathEntries) {
|
|
||||||
File file = new File(classPathEntry, path);
|
|
||||||
if (file.exists()) {
|
|
||||||
return file.lastModified();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void buildClassPath(JpsModule module) {
|
|
||||||
File output = JpsJavaExtensionService.getInstance().getOutputDirectory(module, false);
|
|
||||||
if (output != null) {
|
|
||||||
classPathEntries.add(output.getPath());
|
|
||||||
}
|
|
||||||
|
|
||||||
for (JpsModuleSourceRoot sourceRoot : module.getSourceRoots()) {
|
|
||||||
buildStrategy.addSourcesDirectory(sourceRoot.getFile().getAbsolutePath());
|
|
||||||
}
|
|
||||||
|
|
||||||
for (JpsDependencyElement dependency : module.getDependenciesList().getDependencies()) {
|
|
||||||
if (dependency instanceof JpsModuleDependency) {
|
|
||||||
JpsModuleDependency moduleDependency = (JpsModuleDependency) dependency;
|
|
||||||
File dependencyOutput = JpsJavaExtensionService.getInstance().getOutputDirectory(
|
|
||||||
moduleDependency.getModule(), false);
|
|
||||||
if (dependencyOutput != null && !isBlacklistedDependency(dependencyOutput)) {
|
|
||||||
classPathEntries.add(dependencyOutput.getPath());
|
|
||||||
}
|
|
||||||
for (JpsModuleSourceRoot sourceRoot : moduleDependency.getModule().getSourceRoots()) {
|
|
||||||
buildStrategy.addSourcesDirectory(sourceRoot.getFile().getAbsolutePath());
|
|
||||||
}
|
|
||||||
} else if (dependency instanceof JpsLibraryDependency) {
|
|
||||||
JpsLibrary library = ((JpsLibraryDependency) dependency).getLibrary();
|
|
||||||
if (library == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
classPathEntries.addAll(library.getFiles(JpsOrderRootType.COMPILED).stream().map(File::getPath)
|
|
||||||
.collect(toList()));
|
|
||||||
|
|
||||||
for (JpsLibraryRoot libraryRoot : library.getRoots(JpsOrderRootType.SOURCES)) {
|
|
||||||
File file = getFileFromUrl(libraryRoot.getUrl());
|
|
||||||
if (file != null) {
|
|
||||||
if (file.isDirectory()) {
|
|
||||||
buildStrategy.addSourcesDirectory(file.getAbsolutePath());
|
|
||||||
} else {
|
|
||||||
buildStrategy.addSourcesJar(file.getAbsolutePath());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static boolean isBlacklistedDependency(File dependency) {
|
|
||||||
for (String entry : BLACKLISTED_CLASSES) {
|
|
||||||
if (new File(dependency, entry).exists()) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private File getFileFromUrl(String url) {
|
|
||||||
if (url.startsWith("file://")) {
|
|
||||||
return new File(url.substring("file://".length()));
|
|
||||||
} else if (url.startsWith("jar://")) {
|
|
||||||
int index = url.indexOf('!');
|
|
||||||
return new File(url.substring("file://".length(), index));
|
|
||||||
} else if (url.startsWith("jar:file://")) {
|
|
||||||
int index = url.indexOf('!');
|
|
||||||
return new File(url.substring("jar:file://".length(), index));
|
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,93 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2017 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.jps;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
import org.jetbrains.jps.builders.BuildRootDescriptor;
|
|
||||||
import org.jetbrains.jps.builders.BuildRootIndex;
|
|
||||||
import org.jetbrains.jps.builders.BuildTarget;
|
|
||||||
import org.jetbrains.jps.builders.BuildTargetRegistry;
|
|
||||||
import org.jetbrains.jps.builders.ModuleBasedTarget;
|
|
||||||
import org.jetbrains.jps.builders.TargetOutputIndex;
|
|
||||||
import org.jetbrains.jps.builders.java.JavaModuleBuildTargetType;
|
|
||||||
import org.jetbrains.jps.builders.storage.BuildDataPaths;
|
|
||||||
import org.jetbrains.jps.incremental.CompileContext;
|
|
||||||
import org.jetbrains.jps.incremental.ModuleBuildTarget;
|
|
||||||
import org.jetbrains.jps.indices.IgnoredFileIndex;
|
|
||||||
import org.jetbrains.jps.indices.ModuleExcludeIndex;
|
|
||||||
import org.jetbrains.jps.model.JpsModel;
|
|
||||||
import org.jetbrains.jps.model.module.JpsModule;
|
|
||||||
import org.teavm.idea.jps.model.TeaVMJpsConfiguration;
|
|
||||||
|
|
||||||
public class TeaVMBuildTarget extends ModuleBasedTarget<BuildRootDescriptor> {
|
|
||||||
private TeaVMJpsConfiguration configuration;
|
|
||||||
|
|
||||||
public TeaVMBuildTarget(TeaVMBuildTargetType targetType, @NotNull JpsModule module,
|
|
||||||
@NotNull TeaVMJpsConfiguration configuration) {
|
|
||||||
super(targetType, module);
|
|
||||||
this.configuration = configuration;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isTests() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getId() {
|
|
||||||
return getModule().getName() + "-" + configuration.getTargetType().name();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Collection<BuildTarget<?>> computeDependencies(BuildTargetRegistry targetRegistry,
|
|
||||||
TargetOutputIndex outputIndex) {
|
|
||||||
return Collections.singleton(new ModuleBuildTarget(myModule, JavaModuleBuildTargetType.PRODUCTION));
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public List<BuildRootDescriptor> computeRootDescriptors(JpsModel model, ModuleExcludeIndex index,
|
|
||||||
IgnoredFileIndex ignoredFileIndex, BuildDataPaths dataPaths) {
|
|
||||||
return Collections.emptyList();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
@Override
|
|
||||||
public BuildRootDescriptor findRootDescriptor(String rootId, BuildRootIndex rootIndex) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public String getPresentableName() {
|
|
||||||
return "TeaVM configuration '" + getModule().getName() + "' - " + configuration.getTargetType();
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public Collection<File> getOutputRoots(CompileContext context) {
|
|
||||||
return Collections.singleton(new File(configuration.getTargetDirectory()));
|
|
||||||
}
|
|
||||||
|
|
||||||
public TeaVMJpsConfiguration getConfiguration() {
|
|
||||||
return configuration;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,97 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2017 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.jps;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
import org.jetbrains.jps.builders.BuildTargetLoader;
|
|
||||||
import org.jetbrains.jps.builders.ModuleBasedBuildTargetType;
|
|
||||||
import org.jetbrains.jps.model.JpsModel;
|
|
||||||
import org.jetbrains.jps.model.module.JpsModule;
|
|
||||||
import org.teavm.idea.jps.model.TeaVMJpsConfiguration;
|
|
||||||
import org.teavm.tooling.TeaVMTargetType;
|
|
||||||
|
|
||||||
public class TeaVMBuildTargetType extends ModuleBasedBuildTargetType<TeaVMBuildTarget> {
|
|
||||||
public static final String ID = "teavm";
|
|
||||||
public static final TeaVMBuildTargetType INSTANCE = new TeaVMBuildTargetType();
|
|
||||||
|
|
||||||
private TeaVMBuildTargetType() {
|
|
||||||
super(ID);
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public List<TeaVMBuildTarget> computeAllTargets(@NotNull JpsModel model) {
|
|
||||||
List<TeaVMBuildTarget> targets = new ArrayList<>();
|
|
||||||
for (JpsModule module : model.getProject().getModules()) {
|
|
||||||
for (TeaVMJpsConfiguration config : TeaVMJpsConfiguration.getAll(module)) {
|
|
||||||
targets.add(new TeaVMBuildTarget(this, module, config));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return targets;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public BuildTargetLoader<TeaVMBuildTarget> createLoader(@NotNull JpsModel model) {
|
|
||||||
return new Loader(model);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Loader extends BuildTargetLoader<TeaVMBuildTarget> {
|
|
||||||
private final Map<String, Configuration> modules;
|
|
||||||
|
|
||||||
public Loader(JpsModel model) {
|
|
||||||
modules = new HashMap<>();
|
|
||||||
for (JpsModule module : model.getProject().getModules()) {
|
|
||||||
for (TeaVMJpsConfiguration config : TeaVMJpsConfiguration.getAll(module)) {
|
|
||||||
modules.put(module.getName() + "-" + config.getTargetType().name(),
|
|
||||||
new Configuration(module, config.getTargetType()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
@Override
|
|
||||||
public TeaVMBuildTarget createTarget(@NotNull String targetId) {
|
|
||||||
Configuration configuration = modules.get(targetId);
|
|
||||||
if (configuration == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (TeaVMJpsConfiguration jpsConfig : TeaVMJpsConfiguration.getAll(configuration.module)) {
|
|
||||||
if (jpsConfig.getTargetType() == configuration.type) {
|
|
||||||
return new TeaVMBuildTarget(TeaVMBuildTargetType.this, configuration.module, jpsConfig);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Configuration {
|
|
||||||
final JpsModule module;
|
|
||||||
final TeaVMTargetType type;
|
|
||||||
|
|
||||||
public Configuration(@NotNull JpsModule module, @NotNull TeaVMTargetType type) {
|
|
||||||
this.module = module;
|
|
||||||
this.type = type;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,103 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.jps;
|
|
||||||
|
|
||||||
import static org.teavm.idea.jps.remote.TeaVMBuilderAssistant.REMOTE_PORT;
|
|
||||||
import java.rmi.NotBoundException;
|
|
||||||
import java.rmi.RemoteException;
|
|
||||||
import java.rmi.registry.LocateRegistry;
|
|
||||||
import java.rmi.registry.Registry;
|
|
||||||
import java.util.Collections;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.jetbrains.jps.builders.BuildOutputConsumer;
|
|
||||||
import org.jetbrains.jps.builders.BuildRootDescriptor;
|
|
||||||
import org.jetbrains.jps.builders.DirtyFilesHolder;
|
|
||||||
import org.jetbrains.jps.incremental.CompileContext;
|
|
||||||
import org.jetbrains.jps.incremental.TargetBuilder;
|
|
||||||
import org.jetbrains.jps.incremental.messages.BuildMessage;
|
|
||||||
import org.jetbrains.jps.incremental.messages.CompilerMessage;
|
|
||||||
import org.teavm.idea.jps.remote.TeaVMBuilderAssistant;
|
|
||||||
import org.teavm.tooling.builder.BuildException;
|
|
||||||
import org.teavm.tooling.builder.BuildStrategy;
|
|
||||||
import org.teavm.tooling.builder.InProcessBuildStrategy;
|
|
||||||
import org.teavm.tooling.builder.RemoteBuildStrategy;
|
|
||||||
import org.teavm.tooling.daemon.RemoteBuildService;
|
|
||||||
|
|
||||||
public class TeaVMBuilder extends TargetBuilder<BuildRootDescriptor, TeaVMBuildTarget> {
|
|
||||||
private TeaVMBuilderAssistant assistant;
|
|
||||||
private RemoteBuildService buildService;
|
|
||||||
|
|
||||||
public TeaVMBuilder() {
|
|
||||||
super(Collections.singletonList(TeaVMBuildTargetType.INSTANCE));
|
|
||||||
|
|
||||||
String portString = System.getProperty(REMOTE_PORT);
|
|
||||||
if (portString != null) {
|
|
||||||
try {
|
|
||||||
Registry registry = LocateRegistry.getRegistry(Integer.parseInt(portString));
|
|
||||||
assistant = (TeaVMBuilderAssistant) registry.lookup(TeaVMBuilderAssistant.ID);
|
|
||||||
} catch (NumberFormatException | RemoteException | NotBoundException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
String daemonPortString = System.getProperty(RemoteBuildService.REMOTE_PORT);
|
|
||||||
if (daemonPortString != null) {
|
|
||||||
try {
|
|
||||||
Registry registry = LocateRegistry.getRegistry(Integer.parseInt(daemonPortString));
|
|
||||||
buildService = (RemoteBuildService) registry.lookup(RemoteBuildService.ID);
|
|
||||||
} catch (NumberFormatException | RemoteException | NotBoundException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void build(@NotNull TeaVMBuildTarget target,
|
|
||||||
@NotNull DirtyFilesHolder<BuildRootDescriptor, TeaVMBuildTarget> holder,
|
|
||||||
@NotNull BuildOutputConsumer outputConsumer, @NotNull CompileContext context) {
|
|
||||||
if (assistant == null) {
|
|
||||||
context.processMessage(new CompilerMessage("TeaVM", BuildMessage.Kind.WARNING,
|
|
||||||
"No TeaVM builder assistant available. Diagnostic messages will be less informative"));
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
BuildStrategy buildStrategy = buildService != null
|
|
||||||
? new RemoteBuildStrategy(buildService)
|
|
||||||
: createInProcessBuilder();
|
|
||||||
TeaVMBuild build = new TeaVMBuild(context, assistant, buildStrategy, outputConsumer, buildService != null);
|
|
||||||
|
|
||||||
build.perform(target.getModule(), target);
|
|
||||||
} catch (BuildException e) {
|
|
||||||
context.processMessage(new CompilerMessage("TeaVM", e.getCause()));
|
|
||||||
} catch (Exception e) {
|
|
||||||
context.processMessage(new CompilerMessage("TeaVM", e));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private BuildStrategy createInProcessBuilder() {
|
|
||||||
return new InProcessBuildStrategy((urls, innerClassLoader) -> {
|
|
||||||
RenamingClassLoader loader = new RenamingClassLoader(urls, innerClassLoader);
|
|
||||||
loader.rename("org/objectweb/asm/", "org/teavm/asm/");
|
|
||||||
return loader;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public String getPresentableName() {
|
|
||||||
return "TeaVM builder";
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,38 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.jps;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.jetbrains.jps.builders.BuildTargetType;
|
|
||||||
import org.jetbrains.jps.incremental.BuilderService;
|
|
||||||
import org.jetbrains.jps.incremental.TargetBuilder;
|
|
||||||
|
|
||||||
public class TeaVMBuilderService extends BuilderService {
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public List<? extends TargetBuilder<?, ?>> createBuilders() {
|
|
||||||
return Arrays.asList(new TeaVMBuilder());
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public List<? extends BuildTargetType<?>> getTargetTypes() {
|
|
||||||
return Collections.singletonList(TeaVMBuildTargetType.INSTANCE);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,119 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.jps;
|
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
|
||||||
import java.io.BufferedWriter;
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileInputStream;
|
|
||||||
import java.io.FileOutputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStreamReader;
|
|
||||||
import java.io.OutputStreamWriter;
|
|
||||||
import java.io.Reader;
|
|
||||||
import java.io.Writer;
|
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
import org.jetbrains.jps.incremental.storage.StorageOwner;
|
|
||||||
|
|
||||||
public class TeaVMStorage implements StorageOwner {
|
|
||||||
private File file;
|
|
||||||
private List<Entry> participatingFiles;
|
|
||||||
private boolean dirty;
|
|
||||||
|
|
||||||
TeaVMStorage(File file, String suffix) throws IOException {
|
|
||||||
file = new File(file, "teavm-" + suffix + ".storage");
|
|
||||||
this.file = file;
|
|
||||||
if (file.exists()) {
|
|
||||||
participatingFiles = new ArrayList<>();
|
|
||||||
try (Reader innerReader = new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8);
|
|
||||||
BufferedReader reader = new BufferedReader(innerReader)) {
|
|
||||||
while (true) {
|
|
||||||
String line = reader.readLine();
|
|
||||||
if (line == null) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
line = line.trim();
|
|
||||||
if (line.isEmpty() || line.startsWith("#")) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
int index = line.lastIndexOf(':');
|
|
||||||
if (index < 0) {
|
|
||||||
participatingFiles = null;
|
|
||||||
file.delete();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
participatingFiles.add(new Entry(line.substring(0, index),
|
|
||||||
Long.parseLong(line.substring(index + 1))));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setParticipatingFiles(List<Entry> participatingFiles) {
|
|
||||||
if (participatingFiles == null) {
|
|
||||||
this.participatingFiles = null;
|
|
||||||
} else {
|
|
||||||
this.participatingFiles = new ArrayList<>(participatingFiles);
|
|
||||||
}
|
|
||||||
dirty = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<Entry> getParticipatingFiles() {
|
|
||||||
return participatingFiles != null ? new ArrayList<>(participatingFiles) : null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void flush(boolean b) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void clean() {
|
|
||||||
file.delete();
|
|
||||||
participatingFiles = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void close() throws IOException {
|
|
||||||
if (dirty) {
|
|
||||||
if (participatingFiles == null) {
|
|
||||||
if (file.exists()) {
|
|
||||||
file.delete();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
try (Writer innerWriter = new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8);
|
|
||||||
BufferedWriter writer = new BufferedWriter(innerWriter)) {
|
|
||||||
for (Entry participatingFile : participatingFiles) {
|
|
||||||
writer.append(participatingFile.path + ":" + participatingFile.timestamp);
|
|
||||||
writer.newLine();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class Entry {
|
|
||||||
public final String path;
|
|
||||||
public final long timestamp;
|
|
||||||
|
|
||||||
public Entry(String path, long timestamp) {
|
|
||||||
this.path = path;
|
|
||||||
this.timestamp = timestamp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,35 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.jps;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.jetbrains.jps.builders.storage.StorageProvider;
|
|
||||||
|
|
||||||
public class TeaVMStorageProvider extends StorageProvider<TeaVMStorage> {
|
|
||||||
private String suffix;
|
|
||||||
|
|
||||||
public TeaVMStorageProvider(String suffix) {
|
|
||||||
this.suffix = suffix;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public TeaVMStorage createStorage(File file) throws IOException {
|
|
||||||
return new TeaVMStorage(file, suffix);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1 +0,0 @@
|
||||||
org.teavm.idea.jps.TeaVMBuilderService
|
|
|
@ -1 +0,0 @@
|
||||||
org.teavm.idea.jps.model.TeaVMModelSerializerService
|
|
|
@ -1,24 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
|
|
||||||
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
|
|
||||||
<output url="file://$MODULE_DIR$/target/classes" />
|
|
||||||
<output-test url="file://$MODULE_DIR$/target/test-classes" />
|
|
||||||
<content url="file://$MODULE_DIR$">
|
|
||||||
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
|
|
||||||
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
|
|
||||||
<excludeFolder url="file://$MODULE_DIR$/target" />
|
|
||||||
</content>
|
|
||||||
<orderEntry type="jdk" jdkName="IntelliJ IDEA" jdkType="IDEA JDK" />
|
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
|
||||||
<orderEntry type="module" module-name="teavm-jps-common" />
|
|
||||||
<orderEntry type="module-library">
|
|
||||||
<library>
|
|
||||||
<CLASSES>
|
|
||||||
<root url="jar://$MODULE_DIR$/../idea-artifacts/dependencies/teavm.jar!/" />
|
|
||||||
</CLASSES>
|
|
||||||
<JAVADOC />
|
|
||||||
<SOURCES />
|
|
||||||
</library>
|
|
||||||
</orderEntry>
|
|
||||||
</component>
|
|
||||||
</module>
|
|
|
@ -1,197 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
~ Copyright 2017 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.
|
|
||||||
-->
|
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<parent>
|
|
||||||
<artifactId>teavm-idea-parent</artifactId>
|
|
||||||
<groupId>org.teavm</groupId>
|
|
||||||
<version>0.7.0-SNAPSHOT</version>
|
|
||||||
<relativePath>../pom.xml</relativePath>
|
|
||||||
</parent>
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
|
|
||||||
<artifactId>teavm-idea</artifactId>
|
|
||||||
<name>TeaVM IDEA plugin</name>
|
|
||||||
|
|
||||||
<properties>
|
|
||||||
<idea.artifacts.dir>${basedir}/..</idea.artifacts.dir>
|
|
||||||
</properties>
|
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm.idea</groupId>
|
|
||||||
<artifactId>openapi</artifactId>
|
|
||||||
<version>${idea.version}</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm.idea</groupId>
|
|
||||||
<artifactId>annotations</artifactId>
|
|
||||||
<version>${idea.version}</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm.idea</groupId>
|
|
||||||
<artifactId>util</artifactId>
|
|
||||||
<version>${idea.version}</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm.idea</groupId>
|
|
||||||
<artifactId>extensions</artifactId>
|
|
||||||
<version>${idea.version}</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm.idea</groupId>
|
|
||||||
<artifactId>jdom</artifactId>
|
|
||||||
<version>${idea.version}</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm.idea</groupId>
|
|
||||||
<artifactId>maven</artifactId>
|
|
||||||
<version>${idea.version}</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm.idea</groupId>
|
|
||||||
<artifactId>maven-server-api</artifactId>
|
|
||||||
<version>${idea.version}</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm.idea</groupId>
|
|
||||||
<artifactId>idea</artifactId>
|
|
||||||
<version>${idea.version}</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm.idea</groupId>
|
|
||||||
<artifactId>platform-api</artifactId>
|
|
||||||
<version>${idea.version}</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm.idea</groupId>
|
|
||||||
<artifactId>platform-impl</artifactId>
|
|
||||||
<version>${idea.version}</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm.idea</groupId>
|
|
||||||
<artifactId>commons-logging</artifactId>
|
|
||||||
<version>${idea.version}</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm.idea</groupId>
|
|
||||||
<artifactId>teavm</artifactId>
|
|
||||||
<version>${project.version}</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm.idea</groupId>
|
|
||||||
<artifactId>java-api</artifactId>
|
|
||||||
<version>${idea.version}</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm.idea</groupId>
|
|
||||||
<artifactId>java-impl</artifactId>
|
|
||||||
<version>${idea.version}</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm.idea</groupId>
|
|
||||||
<artifactId>kotlin-plugin</artifactId>
|
|
||||||
<version>${idea.version}</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm.idea</groupId>
|
|
||||||
<artifactId>scala-plugin</artifactId>
|
|
||||||
<version>${idea.version}</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm</groupId>
|
|
||||||
<artifactId>teavm-jps-common</artifactId>
|
|
||||||
<version>${project.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.teavm</groupId>
|
|
||||||
<artifactId>teavm-jps-plugin</artifactId>
|
|
||||||
<version>${project.version}</version>
|
|
||||||
<scope>runtime</scope>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.jetbrains.kotlin</groupId>
|
|
||||||
<artifactId>kotlin-stdlib</artifactId>
|
|
||||||
<version>1.3.61</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
<build>
|
|
||||||
<plugins>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-checkstyle-plugin</artifactId>
|
|
||||||
<configuration>
|
|
||||||
<configLocation>../../checkstyle.xml</configLocation>
|
|
||||||
<propertyExpansion>config_loc=${basedir}/../../../</propertyExpansion>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-assembly-plugin</artifactId>
|
|
||||||
<executions>
|
|
||||||
<execution>
|
|
||||||
<phase>package</phase>
|
|
||||||
<goals>
|
|
||||||
<goal>single</goal>
|
|
||||||
</goals>
|
|
||||||
</execution>
|
|
||||||
</executions>
|
|
||||||
<configuration>
|
|
||||||
<descriptors>
|
|
||||||
<descriptor>src/assembly/plugin.xml</descriptor>
|
|
||||||
</descriptors>
|
|
||||||
<appendAssemblyId>false</appendAssemblyId>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
</plugins>
|
|
||||||
|
|
||||||
<resources>
|
|
||||||
<resource>
|
|
||||||
<directory>src/main/resources</directory>
|
|
||||||
<filtering>true</filtering>
|
|
||||||
</resource>
|
|
||||||
</resources>
|
|
||||||
</build>
|
|
||||||
|
|
||||||
</project>
|
|
|
@ -1,56 +0,0 @@
|
||||||
<!--
|
|
||||||
~ Copyright 2017 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.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">
|
|
||||||
<id>idea-plugin</id>
|
|
||||||
|
|
||||||
<formats>
|
|
||||||
<format>zip</format>
|
|
||||||
</formats>
|
|
||||||
|
|
||||||
<dependencySets>
|
|
||||||
<dependencySet>
|
|
||||||
<outputDirectory>lib</outputDirectory>
|
|
||||||
<includes>
|
|
||||||
<include>org.teavm.idea:teavm:*</include>
|
|
||||||
</includes>
|
|
||||||
<outputFileNameMapping>teavm.jar</outputFileNameMapping>
|
|
||||||
</dependencySet>
|
|
||||||
<dependencySet>
|
|
||||||
<outputDirectory>lib</outputDirectory>
|
|
||||||
<includes>
|
|
||||||
<include>org.teavm:teavm-jps-common</include>
|
|
||||||
</includes>
|
|
||||||
<outputFileNameMapping>teavm-jps-common.jar</outputFileNameMapping>
|
|
||||||
</dependencySet>
|
|
||||||
<dependencySet>
|
|
||||||
<outputDirectory>lib/jps</outputDirectory>
|
|
||||||
<includes>
|
|
||||||
<include>org.teavm:teavm-jps-plugin</include>
|
|
||||||
</includes>
|
|
||||||
<outputFileNameMapping>teavm-jps-plugin.jar</outputFileNameMapping>
|
|
||||||
</dependencySet>
|
|
||||||
</dependencySets>
|
|
||||||
|
|
||||||
<files>
|
|
||||||
<file>
|
|
||||||
<outputDirectory>lib</outputDirectory>
|
|
||||||
<source>target/${project.artifactId}-${project.version}.jar</source>
|
|
||||||
<destName>teavm-plugin.jar</destName>
|
|
||||||
</file>
|
|
||||||
</files>
|
|
||||||
</assembly>
|
|
|
@ -1,147 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2017 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.openapi.components.ApplicationComponent;
|
|
||||||
import com.intellij.openapi.components.ServiceManager;
|
|
||||||
import java.io.IOException;
|
|
||||||
import org.apache.commons.logging.Log;
|
|
||||||
import org.apache.commons.logging.LogFactory;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.teavm.idea.jps.model.TeaVMJpsWorkspaceConfiguration;
|
|
||||||
import org.teavm.tooling.daemon.BuildDaemon;
|
|
||||||
import org.teavm.tooling.daemon.DaemonInfo;
|
|
||||||
import org.teavm.tooling.daemon.DaemonLog;
|
|
||||||
|
|
||||||
public class TeaVMDaemonComponent implements ApplicationComponent {
|
|
||||||
private DaemonInfo daemonInfo;
|
|
||||||
private boolean incremental;
|
|
||||||
private int daemonMemory;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void initComponent() {
|
|
||||||
TeaVMWorkspaceConfigurationStorage configurationStorage = ServiceManager.getService(
|
|
||||||
TeaVMWorkspaceConfigurationStorage.class);
|
|
||||||
if (configurationStorage != null) {
|
|
||||||
TeaVMJpsWorkspaceConfiguration configuration = configurationStorage.getState();
|
|
||||||
incremental = configuration.isIncremental();
|
|
||||||
daemonMemory = configuration.getDaemonMemory();
|
|
||||||
if (configuration.isDaemonEnabled()) {
|
|
||||||
startDaemon();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private TeaVMWorkspaceConfigurationStorage getConfigurationStorage() {
|
|
||||||
return ServiceManager.getService(TeaVMWorkspaceConfigurationStorage.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void disposeComponent() {
|
|
||||||
if (daemonInfo != null) {
|
|
||||||
daemonInfo.getProcess().destroy();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isDaemonRunning() {
|
|
||||||
return daemonInfo != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getDaemonPort() {
|
|
||||||
return daemonInfo.getPort();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void startDaemon() {
|
|
||||||
if (daemonInfo == null) {
|
|
||||||
try {
|
|
||||||
Log log = LogFactory.getLog(TeaVMDaemonComponent.class);
|
|
||||||
daemonInfo = BuildDaemon.start(incremental, daemonMemory, new LogWrapper(log),
|
|
||||||
DaemonUtil.detectClassPath().toArray(new String[0]));
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
updateConfiguration(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void stopDaemon() {
|
|
||||||
if (daemonInfo != null) {
|
|
||||||
daemonInfo.getProcess().destroy();
|
|
||||||
daemonInfo = null;
|
|
||||||
updateConfiguration(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isIncremental() {
|
|
||||||
return incremental;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setIncremental(boolean incremental) {
|
|
||||||
this.incremental = incremental;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getDaemonMemory() {
|
|
||||||
return daemonMemory;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDaemonMemory(int daemonMemory) {
|
|
||||||
this.daemonMemory = daemonMemory;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void applyChanges() {
|
|
||||||
TeaVMWorkspaceConfigurationStorage configurationStorage = getConfigurationStorage();
|
|
||||||
TeaVMJpsWorkspaceConfiguration configuration = configurationStorage.getState();
|
|
||||||
configuration.setIncremental(incremental);
|
|
||||||
configuration.setDaemonMemory(daemonMemory);
|
|
||||||
configurationStorage.loadState(configuration);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateConfiguration(boolean daemonEnabled) {
|
|
||||||
TeaVMWorkspaceConfigurationStorage configurationStorage = getConfigurationStorage();
|
|
||||||
TeaVMJpsWorkspaceConfiguration configuration = configurationStorage.getState();
|
|
||||||
configuration.setDaemonEnabled(daemonEnabled);
|
|
||||||
configurationStorage.loadState(configuration);
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public String getComponentName() {
|
|
||||||
return "TeaVM daemon";
|
|
||||||
}
|
|
||||||
|
|
||||||
static class LogWrapper implements DaemonLog {
|
|
||||||
private Log log;
|
|
||||||
|
|
||||||
public LogWrapper(Log log) {
|
|
||||||
this.log = log;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void error(String s) {
|
|
||||||
log.error(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void error(String s, Throwable throwable) {
|
|
||||||
log.error(s, throwable);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void info(String s) {
|
|
||||||
log.info(s);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,29 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.openapi.module.Module;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
public class TeaVMFacet extends Facet<TeaVMFacetConfiguration> {
|
|
||||||
public TeaVMFacet(@NotNull FacetType<TeaVMFacet, TeaVMFacetConfiguration> facetType, @NotNull Module module,
|
|
||||||
@NotNull String name, @NotNull TeaVMFacetConfiguration configuration, @Nullable Facet<?> underlyingFacet) {
|
|
||||||
super(facetType, module, name, configuration, underlyingFacet);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,57 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.FacetConfiguration;
|
|
||||||
import com.intellij.facet.ui.FacetEditorContext;
|
|
||||||
import com.intellij.facet.ui.FacetEditorTab;
|
|
||||||
import com.intellij.facet.ui.FacetValidatorsManager;
|
|
||||||
import com.intellij.openapi.components.PersistentStateComponent;
|
|
||||||
import com.intellij.openapi.util.InvalidDataException;
|
|
||||||
import com.intellij.openapi.util.WriteExternalException;
|
|
||||||
import org.jdom.Element;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
import org.teavm.idea.jps.model.TeaVMJpsConfiguration;
|
|
||||||
import org.teavm.idea.ui.TeaVMFacetEditorTab;
|
|
||||||
|
|
||||||
public class TeaVMFacetConfiguration implements FacetConfiguration, PersistentStateComponent<TeaVMJpsConfiguration> {
|
|
||||||
private TeaVMJpsConfiguration state = new TeaVMJpsConfiguration();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public FacetEditorTab[] createEditorTabs(FacetEditorContext editorContext,
|
|
||||||
FacetValidatorsManager validatorsManager) {
|
|
||||||
return new FacetEditorTab[] { new TeaVMFacetEditorTab(editorContext.getModule(), state) };
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void readExternal(Element element) throws InvalidDataException {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void writeExternal(Element element) throws WriteExternalException {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
@Override
|
|
||||||
public TeaVMJpsConfiguration getState() {
|
|
||||||
return state;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void loadState(TeaVMJpsConfiguration state) {
|
|
||||||
this.state = state;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,64 +0,0 @@
|
||||||
/*
|
|
||||||
* 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 TeaVMFacetType extends FacetType<TeaVMFacet, TeaVMFacetConfiguration> {
|
|
||||||
public static final FacetTypeId<TeaVMFacet> TYPE_ID = new FacetTypeId<>("teavm-js");
|
|
||||||
private static final Icon icon = IconLoader.getIcon("/teavm-16.png");
|
|
||||||
|
|
||||||
public TeaVMFacetType() {
|
|
||||||
super(TYPE_ID, "teavm-js", "TeaVM (JS)");
|
|
||||||
}
|
|
||||||
|
|
||||||
@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 TeaVMFacetType getInstance() {
|
|
||||||
return (TeaVMFacetType) FacetTypeRegistry.getInstance().findFacetType(TYPE_ID);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,47 +0,0 @@
|
||||||
/*
|
|
||||||
* 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 static org.teavm.idea.jps.remote.TeaVMBuilderAssistant.REMOTE_PORT;
|
|
||||||
import com.intellij.compiler.server.BuildProcessParametersProvider;
|
|
||||||
import com.intellij.openapi.application.Application;
|
|
||||||
import com.intellij.openapi.application.ApplicationManager;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.teavm.tooling.daemon.RemoteBuildService;
|
|
||||||
|
|
||||||
public class TeaVMJPSConfigurator extends BuildProcessParametersProvider {
|
|
||||||
private TeaVMJPSRemoteService remoteService;
|
|
||||||
private TeaVMDaemonComponent daemonComponent;
|
|
||||||
|
|
||||||
public TeaVMJPSConfigurator() {
|
|
||||||
Application app = ApplicationManager.getApplication();
|
|
||||||
this.remoteService = app.getComponent(TeaVMJPSRemoteService.class);
|
|
||||||
this.daemonComponent = app.getComponent(TeaVMDaemonComponent.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public List<String> getVMArguments() {
|
|
||||||
List<String> result = new ArrayList<>();
|
|
||||||
result.add("-D" + REMOTE_PORT + "=" + remoteService.getPort());
|
|
||||||
if (daemonComponent.isDaemonRunning()) {
|
|
||||||
result.add("-D" + RemoteBuildService.REMOTE_PORT + "=" + daemonComponent.getDaemonPort());
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,151 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.openapi.application.ApplicationManager;
|
|
||||||
import com.intellij.openapi.components.ApplicationComponent;
|
|
||||||
import com.intellij.openapi.editor.Document;
|
|
||||||
import com.intellij.openapi.project.Project;
|
|
||||||
import com.intellij.openapi.project.ProjectManager;
|
|
||||||
import com.intellij.psi.JavaPsiFacade;
|
|
||||||
import com.intellij.psi.PsiClass;
|
|
||||||
import com.intellij.psi.PsiElement;
|
|
||||||
import com.intellij.psi.PsiFile;
|
|
||||||
import com.intellij.psi.PsiMethod;
|
|
||||||
import com.intellij.psi.PsiParameter;
|
|
||||||
import com.intellij.psi.PsiType;
|
|
||||||
import com.intellij.psi.search.GlobalSearchScope;
|
|
||||||
import com.siyeh.ig.fixes.MemberSignature;
|
|
||||||
import java.rmi.AlreadyBoundException;
|
|
||||||
import java.rmi.NotBoundException;
|
|
||||||
import java.rmi.RemoteException;
|
|
||||||
import java.rmi.registry.LocateRegistry;
|
|
||||||
import java.rmi.registry.Registry;
|
|
||||||
import java.rmi.server.UnicastRemoteObject;
|
|
||||||
import java.util.Random;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.teavm.idea.jps.remote.TeaVMBuilderAssistant;
|
|
||||||
import org.teavm.idea.jps.remote.TeaVMElementLocation;
|
|
||||||
|
|
||||||
public class TeaVMJPSRemoteService extends UnicastRemoteObject implements ApplicationComponent, TeaVMBuilderAssistant {
|
|
||||||
private static final int MIN_PORT = 10000;
|
|
||||||
private static final int MAX_PORT = 1 << 16;
|
|
||||||
private ProjectManager projectManager;
|
|
||||||
private int port;
|
|
||||||
private Registry registry;
|
|
||||||
|
|
||||||
public TeaVMJPSRemoteService() throws RemoteException {
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
private synchronized ProjectManager getProjectManager() {
|
|
||||||
if (projectManager == null) {
|
|
||||||
projectManager = ProjectManager.getInstance();
|
|
||||||
}
|
|
||||||
return projectManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void initComponent() {
|
|
||||||
Random random = new Random();
|
|
||||||
for (int i = 0; i < 20; ++i) {
|
|
||||||
port = random.nextInt(MAX_PORT - MIN_PORT) + MIN_PORT;
|
|
||||||
try {
|
|
||||||
registry = LocateRegistry.createRegistry(port);
|
|
||||||
} catch (RemoteException e) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
registry.bind(TeaVMBuilderAssistant.ID, this);
|
|
||||||
} catch (RemoteException | AlreadyBoundException e) {
|
|
||||||
throw new IllegalStateException("Could not bind remote build assistant service", e);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
throw new IllegalStateException("Could not create RMI registry");
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getPort() {
|
|
||||||
return port;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void disposeComponent() {
|
|
||||||
try {
|
|
||||||
registry.unbind(TeaVMBuilderAssistant.ID);
|
|
||||||
UnicastRemoteObject.unexportObject(registry, true);
|
|
||||||
} catch (RemoteException | NotBoundException e) {
|
|
||||||
throw new IllegalStateException("Could not clean-up RMI server", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public String getComponentName() {
|
|
||||||
return "TeaVM JPS service";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TeaVMElementLocation getMethodLocation(String className, String methodName, String methodDesc) {
|
|
||||||
TeaVMElementLocation[] resultHolder = new TeaVMElementLocation[1];
|
|
||||||
|
|
||||||
ApplicationManager.getApplication().runReadAction(() -> {
|
|
||||||
for (Project project : getProjectManager().getOpenProjects()) {
|
|
||||||
JavaPsiFacade psi = JavaPsiFacade.getInstance(project);
|
|
||||||
PsiClass cls = psi.findClass(className, GlobalSearchScope.allScope(project));
|
|
||||||
if (cls == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (PsiMethod method : cls.getAllMethods()) {
|
|
||||||
if (!method.getName().equals(methodName) || !getMethodSignature(method).equals(methodDesc)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
resultHolder[0] = getMethodLocation(method);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return resultHolder[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getMethodSignature(PsiMethod method) {
|
|
||||||
StringBuilder sb = new StringBuilder("(");
|
|
||||||
for (PsiParameter parameter : method.getParameterList().getParameters()) {
|
|
||||||
sb.append(MemberSignature.createTypeSignature(parameter.getType()));
|
|
||||||
}
|
|
||||||
sb.append(")");
|
|
||||||
|
|
||||||
PsiType returnType = method.getReturnType();
|
|
||||||
sb.append(MemberSignature.createTypeSignature(returnType != null ? returnType : PsiType.VOID));
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
private TeaVMElementLocation getMethodLocation(PsiMethod method) {
|
|
||||||
PsiElement element = method.getNameIdentifier();
|
|
||||||
if (element == null) {
|
|
||||||
element = method.getNavigationElement();
|
|
||||||
}
|
|
||||||
PsiFile psiFile = element.getContainingFile();
|
|
||||||
Document document = psiFile.getViewProvider().getDocument();
|
|
||||||
int offset = element.getTextRange().getStartOffset();
|
|
||||||
int line = offset >= 0 ? document.getLineNumber(offset) + 1 : -1;
|
|
||||||
int column = offset >= 0 ? offset - document.getLineStartOffset(line) + 1 : -1;
|
|
||||||
return new TeaVMElementLocation(offset, element.getTextRange().getEndOffset(),
|
|
||||||
line, column, psiFile.getVirtualFile().getPath());
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,64 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.findIcon("/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);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,38 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2017 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.openapi.components.PersistentStateComponent;
|
|
||||||
import com.intellij.openapi.components.State;
|
|
||||||
import com.intellij.openapi.components.Storage;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
import org.teavm.idea.jps.model.TeaVMJpsWorkspaceConfiguration;
|
|
||||||
|
|
||||||
@State(name = "teavm", storages = @Storage(value = "teavm.xml"))
|
|
||||||
public class TeaVMWorkspaceConfigurationStorage implements PersistentStateComponent<TeaVMJpsWorkspaceConfiguration> {
|
|
||||||
private TeaVMJpsWorkspaceConfiguration state = new TeaVMJpsWorkspaceConfiguration();
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
@Override
|
|
||||||
public TeaVMJpsWorkspaceConfiguration getState() {
|
|
||||||
return state.createCopy();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void loadState(TeaVMJpsWorkspaceConfiguration configuration) {
|
|
||||||
state.applyChanges(configuration);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,111 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.debug;
|
|
||||||
|
|
||||||
import com.intellij.util.PlatformIcons;
|
|
||||||
import com.intellij.xdebugger.frame.XCompositeNode;
|
|
||||||
import com.intellij.xdebugger.frame.XNamedValue;
|
|
||||||
import com.intellij.xdebugger.frame.XValueNode;
|
|
||||||
import com.intellij.xdebugger.frame.XValuePlace;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Objects;
|
|
||||||
import javax.swing.Icon;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.teavm.common.Promise;
|
|
||||||
import org.teavm.debugging.Value;
|
|
||||||
import org.teavm.debugging.Variable;
|
|
||||||
|
|
||||||
public class TeaVMValue extends XNamedValue {
|
|
||||||
private boolean root;
|
|
||||||
private Value innerValue;
|
|
||||||
|
|
||||||
public TeaVMValue(@NotNull String name, boolean root, Value innerValue) {
|
|
||||||
super(name);
|
|
||||||
this.root = root;
|
|
||||||
this.innerValue = innerValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void computePresentation(@NotNull XValueNode node, @NotNull XValuePlace place) {
|
|
||||||
Icon icon = root ? PlatformIcons.VARIABLE_ICON : PlatformIcons.FIELD_ICON;
|
|
||||||
innerValue.getRepresentation()
|
|
||||||
.then(representation -> representation != null ? representation : "null")
|
|
||||||
.thenVoid(representation -> {
|
|
||||||
innerValue.getType().thenVoid(type -> {
|
|
||||||
if (Objects.equals(type, "java.lang.String")) {
|
|
||||||
getStringRepresentation().thenVoid(str -> node.setPresentation(icon, type, str, true));
|
|
||||||
} else {
|
|
||||||
innerValue.hasInnerStructure().then(innerStructure -> {
|
|
||||||
node.setPresentation(icon, type, representation, innerStructure);
|
|
||||||
return null;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private Promise<String> getStringRepresentation() {
|
|
||||||
return innerValue.getProperties().thenAsync(properties -> {
|
|
||||||
Variable charactersProperty = properties.get("characters");
|
|
||||||
if (charactersProperty == null) {
|
|
||||||
return errorString();
|
|
||||||
}
|
|
||||||
return charactersProperty.getValue().getProperties().thenAsync(dataValueProperties -> {
|
|
||||||
int[] indexes = dataValueProperties.keySet().stream()
|
|
||||||
.filter(t -> isDigits(t))
|
|
||||||
.mapToInt(Integer::parseInt)
|
|
||||||
.toArray();
|
|
||||||
int maxIndex = Math.min(Arrays.stream(indexes).max().orElse(-1) + 1, 256);
|
|
||||||
char[] chars = new char[maxIndex];
|
|
||||||
List<Promise<Void>> promises = new ArrayList<>();
|
|
||||||
for (int i = 0; i < maxIndex; ++i) {
|
|
||||||
Variable charProperty = dataValueProperties.get(Integer.toString(i));
|
|
||||||
if (charProperty != null) {
|
|
||||||
int index = i;
|
|
||||||
promises.add(charProperty.getValue().getRepresentation().thenVoid(charRepr -> {
|
|
||||||
if (isDigits(charRepr)) {
|
|
||||||
chars[index] = (char) Integer.parseInt(charRepr);
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return Promise.allVoid(promises).thenAsync(v -> Promise.of(new String(chars)));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private Promise<String> errorString() {
|
|
||||||
return Promise.of("<could not calculate string value>");
|
|
||||||
}
|
|
||||||
|
|
||||||
private static boolean isDigits(String str) {
|
|
||||||
for (int i = 0; i < str.length(); ++i) {
|
|
||||||
char c = str.charAt(i);
|
|
||||||
if (c < '0' || c > '9') {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void computeChildren(@NotNull XCompositeNode node) {
|
|
||||||
TeaVMStackFrame.computeChildrenImpl(node, innerValue.getProperties(), false);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,167 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.maven;
|
|
||||||
|
|
||||||
import com.intellij.facet.FacetManager;
|
|
||||||
import com.intellij.facet.FacetType;
|
|
||||||
import com.intellij.facet.ModifiableFacetModel;
|
|
||||||
import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider;
|
|
||||||
import com.intellij.openapi.module.Module;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
import org.jdom.Element;
|
|
||||||
import org.jetbrains.idea.maven.importing.MavenImporter;
|
|
||||||
import org.jetbrains.idea.maven.importing.MavenRootModelAdapter;
|
|
||||||
import org.jetbrains.idea.maven.model.MavenPlugin;
|
|
||||||
import org.jetbrains.idea.maven.project.MavenProject;
|
|
||||||
import org.jetbrains.idea.maven.project.MavenProjectChanges;
|
|
||||||
import org.jetbrains.idea.maven.project.MavenProjectsProcessorTask;
|
|
||||||
import org.jetbrains.idea.maven.project.MavenProjectsTree;
|
|
||||||
import org.teavm.idea.TeaVMFacet;
|
|
||||||
import org.teavm.idea.TeaVMFacetConfiguration;
|
|
||||||
import org.teavm.idea.TeaVMFacetType;
|
|
||||||
import org.teavm.idea.TeaVMWebAssemblyFacetType;
|
|
||||||
import org.teavm.idea.jps.model.TeaVMJpsConfiguration;
|
|
||||||
import org.teavm.idea.jps.model.TeaVMProperty;
|
|
||||||
import org.teavm.tooling.TeaVMTargetType;
|
|
||||||
|
|
||||||
public class TeaVMMavenImporter extends MavenImporter {
|
|
||||||
public TeaVMMavenImporter() {
|
|
||||||
super("org.teavm", "teavm-maven-plugin");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void preProcess(Module module, MavenProject mavenProject, MavenProjectChanges changes,
|
|
||||||
IdeModifiableModelsProvider modifiableModelsProvider) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void process(IdeModifiableModelsProvider modifiableModelsProvider, Module module,
|
|
||||||
MavenRootModelAdapter rootModel, MavenProjectsTree mavenModel, MavenProject mavenProject,
|
|
||||||
MavenProjectChanges changes, Map<MavenProject, String> mavenProjectToModuleName,
|
|
||||||
List<MavenProjectsProcessorTask> postTasks) {
|
|
||||||
FacetManager facetManager = FacetManager.getInstance(module);
|
|
||||||
ModifiableFacetModel facetModel = modifiableModelsProvider.getModifiableFacetModel(module);
|
|
||||||
Set<String> targetTypes = new HashSet<>();
|
|
||||||
for (MavenPlugin mavenPlugin : mavenProject.getPlugins()) {
|
|
||||||
if (mavenPlugin.getGroupId().equals(myPluginGroupID)
|
|
||||||
&& mavenPlugin.getArtifactId().equals(myPluginArtifactID)) {
|
|
||||||
updateConfiguration(mavenPlugin, facetModel, facetManager, targetTypes);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateConfiguration(MavenPlugin plugin, ModifiableFacetModel facetModel, FacetManager facetManager,
|
|
||||||
Set<String> targetTypes) {
|
|
||||||
if (plugin.getConfigurationElement() != null) {
|
|
||||||
updateConfiguration(plugin.getConfigurationElement(), facetModel, facetManager, targetTypes);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (MavenPlugin.Execution execution : plugin.getExecutions()) {
|
|
||||||
if (execution.getGoals().contains("compile")) {
|
|
||||||
if (execution.getConfigurationElement() != null) {
|
|
||||||
updateConfiguration(execution.getConfigurationElement(), facetModel, facetManager, targetTypes);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateConfiguration(Element source, ModifiableFacetModel facetModel, FacetManager facetManager,
|
|
||||||
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());
|
|
||||||
|
|
||||||
boolean justCreated = false;
|
|
||||||
if (facet == null) {
|
|
||||||
facet = facetManager.createFacet(facetType, facetType.getDefaultFacetName(), null);
|
|
||||||
facetModel.addFacet(facet);
|
|
||||||
justCreated = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
TeaVMJpsConfiguration configuration = facet.getConfiguration().getState();
|
|
||||||
if (justCreated) {
|
|
||||||
configuration.setSkipped(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Element child : source.getChildren()) {
|
|
||||||
switch (child.getName()) {
|
|
||||||
case "sourceFilesCopied":
|
|
||||||
if (justCreated) {
|
|
||||||
configuration.setSourceFilesCopied(true);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case "sourceMapsGenerated":
|
|
||||||
if (justCreated) {
|
|
||||||
configuration.setSourceMapsFileGenerated(true);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case "targetDirectory":
|
|
||||||
configuration.setTargetDirectory(child.getTextTrim());
|
|
||||||
break;
|
|
||||||
case "mainClass":
|
|
||||||
configuration.setMainClass(child.getTextTrim());
|
|
||||||
break;
|
|
||||||
case "properties":
|
|
||||||
configuration.setProperties(extractProperties(child));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
facet.getConfiguration().loadState(configuration);
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<TeaVMProperty> extractProperties(Element element) {
|
|
||||||
List<TeaVMProperty> properties = new ArrayList<>();
|
|
||||||
for (Element child : element.getChildren()) {
|
|
||||||
TeaVMProperty property = new TeaVMProperty();
|
|
||||||
property.setKey(child.getName());
|
|
||||||
property.setValue(child.getTextTrim());
|
|
||||||
properties.add(property);
|
|
||||||
}
|
|
||||||
return properties;
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,75 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.ui;
|
|
||||||
|
|
||||||
import com.intellij.openapi.module.Module;
|
|
||||||
import com.intellij.openapi.options.Configurable;
|
|
||||||
import javax.swing.JComponent;
|
|
||||||
import org.jetbrains.annotations.Nls;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
import org.teavm.idea.jps.model.TeaVMJpsConfiguration;
|
|
||||||
|
|
||||||
public class TeaVMConfigurable implements Configurable {
|
|
||||||
private final Module module;
|
|
||||||
private TeaVMConfigurationPanel panel;
|
|
||||||
private TeaVMJpsConfiguration configuration;
|
|
||||||
|
|
||||||
public TeaVMConfigurable(Module module, TeaVMJpsConfiguration configuration) {
|
|
||||||
this.module = module;
|
|
||||||
this.configuration = configuration;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nls
|
|
||||||
@Override
|
|
||||||
public String getDisplayName() {
|
|
||||||
return "TeaVM";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
@Override
|
|
||||||
public String getHelpTopic() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
@Override
|
|
||||||
public JComponent createComponent() {
|
|
||||||
if (panel == null) {
|
|
||||||
panel = new TeaVMConfigurationPanel(module.getProject());
|
|
||||||
}
|
|
||||||
return panel;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isModified() {
|
|
||||||
return panel != null && panel.isModified();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void apply() {
|
|
||||||
panel.save(configuration);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void reset() {
|
|
||||||
panel.load(configuration);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void disposeUIResources() {
|
|
||||||
this.panel = null;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,373 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.ui;
|
|
||||||
|
|
||||||
import com.intellij.ide.util.TreeClassChooser;
|
|
||||||
import com.intellij.ide.util.TreeClassChooserFactory;
|
|
||||||
import com.intellij.openapi.application.ApplicationManager;
|
|
||||||
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
|
|
||||||
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
|
|
||||||
import com.intellij.openapi.project.Project;
|
|
||||||
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
|
|
||||||
import com.intellij.openapi.util.Computable;
|
|
||||||
import com.intellij.psi.PsiClass;
|
|
||||||
import com.intellij.psi.search.GlobalSearchScope;
|
|
||||||
import com.intellij.psi.util.PsiMethodUtil;
|
|
||||||
import com.intellij.ui.IdeBorderFactory;
|
|
||||||
import com.intellij.ui.ToolbarDecorator;
|
|
||||||
import com.intellij.ui.components.JBLabel;
|
|
||||||
import com.intellij.ui.table.JBTable;
|
|
||||||
import com.intellij.util.ui.EditableModel;
|
|
||||||
import java.awt.BorderLayout;
|
|
||||||
import java.awt.Font;
|
|
||||||
import java.awt.GridBagConstraints;
|
|
||||||
import java.awt.GridBagLayout;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.function.BiConsumer;
|
|
||||||
import java.util.function.Consumer;
|
|
||||||
import java.util.function.Function;
|
|
||||||
import java.util.function.Supplier;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
import javax.swing.DefaultComboBoxModel;
|
|
||||||
import javax.swing.JComboBox;
|
|
||||||
import javax.swing.JPanel;
|
|
||||||
import javax.swing.table.AbstractTableModel;
|
|
||||||
import org.teavm.idea.jps.model.TeaVMJpsConfiguration;
|
|
||||||
import org.teavm.idea.jps.model.TeaVMProperty;
|
|
||||||
|
|
||||||
class TeaVMConfigurationPanel extends JPanel {
|
|
||||||
private final JComboBox<ComboBoxItem<Boolean>> skipField = new JComboBox<>(new DefaultComboBoxModel<>());
|
|
||||||
private final TextFieldWithBrowseButton mainClassField = new TextFieldWithBrowseButton(event -> chooseMainClass());
|
|
||||||
private final TextFieldWithBrowseButton targetDirectoryField = new TextFieldWithBrowseButton();
|
|
||||||
private final JComboBox<ComboBoxItem<Boolean>> sourceMapsField = new JComboBox<>(new DefaultComboBoxModel<>());
|
|
||||||
private final JComboBox<ComboBoxItem<Boolean>> copySourcesField = new JComboBox<>(new DefaultComboBoxModel<>());
|
|
||||||
private final JBTable propertiesTable = new JBTable();
|
|
||||||
private final PropertiesModel propertiesModel = new PropertiesModel();
|
|
||||||
private final TeaVMJpsConfiguration initialConfiguration = new TeaVMJpsConfiguration();
|
|
||||||
private final Project project;
|
|
||||||
|
|
||||||
private final List<ComboBoxItem<Boolean>> sourceMapsOptions = Arrays.asList(new ComboBoxItem<>(true, "Generate"),
|
|
||||||
new ComboBoxItem<>(false, "Skip"));
|
|
||||||
|
|
||||||
private final List<ComboBoxItem<Boolean>> copySourcesOptions = Arrays.asList(new ComboBoxItem<>(true, "Copy"),
|
|
||||||
new ComboBoxItem<>(false, "Skip"));
|
|
||||||
|
|
||||||
private final List<ComboBoxItem<Boolean>> skipOptions = Arrays.asList(new ComboBoxItem<>(true, "Skip"),
|
|
||||||
new ComboBoxItem<>(false, "Don't skip"));
|
|
||||||
|
|
||||||
private final List<Field<?>> fields = Arrays.asList(
|
|
||||||
new Field<>(TeaVMJpsConfiguration::setSkipped, TeaVMJpsConfiguration::isSkipped,
|
|
||||||
value -> skipField.setSelectedIndex(value ? 0 : 1),
|
|
||||||
() -> skipOptions.get(skipField.getSelectedIndex()).value),
|
|
||||||
new Field<>(TeaVMJpsConfiguration::setMainClass, TeaVMJpsConfiguration::getMainClass,
|
|
||||||
mainClassField::setText, mainClassField::getText),
|
|
||||||
new Field<>(TeaVMJpsConfiguration::setTargetDirectory, TeaVMJpsConfiguration::getTargetDirectory,
|
|
||||||
targetDirectoryField::setText, targetDirectoryField::getText),
|
|
||||||
new Field<>(TeaVMJpsConfiguration::setSourceMapsFileGenerated,
|
|
||||||
TeaVMJpsConfiguration::isSourceMapsFileGenerated,
|
|
||||||
value -> sourceMapsField.setSelectedIndex(value ? 0 : 1),
|
|
||||||
() -> sourceMapsOptions.get(sourceMapsField.getSelectedIndex()).value),
|
|
||||||
new Field<>(TeaVMJpsConfiguration::setSourceFilesCopied,
|
|
||||||
TeaVMJpsConfiguration::isSourceFilesCopied,
|
|
||||||
value -> copySourcesField.setSelectedIndex(value ? 0 : 1),
|
|
||||||
() -> copySourcesOptions.get(copySourcesField.getSelectedIndex()).value)
|
|
||||||
);
|
|
||||||
|
|
||||||
TeaVMConfigurationPanel(Project project) {
|
|
||||||
this.project = project;
|
|
||||||
propertiesTable.setModel(propertiesModel);
|
|
||||||
setupLayout();
|
|
||||||
|
|
||||||
FileChooserDescriptor targetDirectoryChooserDescriptor = FileChooserDescriptorFactory
|
|
||||||
.createSingleFolderDescriptor();
|
|
||||||
targetDirectoryField.addBrowseFolderListener("Target Directory", "Please, select folder where TeaVM should"
|
|
||||||
+ "write generated JS files", project, targetDirectoryChooserDescriptor);
|
|
||||||
|
|
||||||
sourceMapsOptions.forEach(sourceMapsField::addItem);
|
|
||||||
copySourcesOptions.forEach(copySourcesField::addItem);
|
|
||||||
skipOptions.forEach(skipField::addItem);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setupLayout() {
|
|
||||||
setLayout(new GridBagLayout());
|
|
||||||
|
|
||||||
GridBagConstraints labelConstraints = new GridBagConstraints();
|
|
||||||
labelConstraints.gridwidth = GridBagConstraints.REMAINDER;
|
|
||||||
labelConstraints.anchor = GridBagConstraints.BASELINE_LEADING;
|
|
||||||
labelConstraints.weightx = 1;
|
|
||||||
labelConstraints.weighty = 1;
|
|
||||||
labelConstraints.insets.left = 5;
|
|
||||||
labelConstraints.insets.right = 5;
|
|
||||||
|
|
||||||
GridBagConstraints descriptionConstraints = (GridBagConstraints) labelConstraints.clone();
|
|
||||||
descriptionConstraints.fill = GridBagConstraints.BOTH;
|
|
||||||
descriptionConstraints.anchor = GridBagConstraints.BASELINE_LEADING;
|
|
||||||
descriptionConstraints.insets.top = 3;
|
|
||||||
|
|
||||||
GridBagConstraints fieldConstraints = new GridBagConstraints();
|
|
||||||
fieldConstraints.gridwidth = GridBagConstraints.REMAINDER;
|
|
||||||
fieldConstraints.fill = GridBagConstraints.HORIZONTAL;
|
|
||||||
fieldConstraints.anchor = GridBagConstraints.BASELINE_LEADING;
|
|
||||||
fieldConstraints.weightx = 1;
|
|
||||||
fieldConstraints.weighty = 1;
|
|
||||||
fieldConstraints.insets.top = 5;
|
|
||||||
fieldConstraints.insets.bottom = 20;
|
|
||||||
fieldConstraints.insets.left = 10;
|
|
||||||
fieldConstraints.insets.right = 10;
|
|
||||||
|
|
||||||
add(bold(new JBLabel("Skip TeaVM compilation")), labelConstraints);
|
|
||||||
add(skipField, fieldConstraints);
|
|
||||||
|
|
||||||
add(bold(new JBLabel("Main class")), labelConstraints);
|
|
||||||
add(mainClassField, fieldConstraints);
|
|
||||||
|
|
||||||
add(bold(new JBLabel("Target directory")), labelConstraints);
|
|
||||||
add(targetDirectoryField, fieldConstraints);
|
|
||||||
|
|
||||||
fieldConstraints.fill = GridBagConstraints.NONE;
|
|
||||||
|
|
||||||
add(bold(new JBLabel("Source maps")), labelConstraints);
|
|
||||||
add(new JBLabel("Indicates whether TeaVM should generate source maps."), descriptionConstraints);
|
|
||||||
add(new JBLabel("With source maps you can debug code in the browser's devtools."), descriptionConstraints);
|
|
||||||
add(sourceMapsField, fieldConstraints);
|
|
||||||
|
|
||||||
add(bold(new JBLabel("Copy source code")), labelConstraints);
|
|
||||||
add(new JBLabel("Source maps require your server to provide source code."), descriptionConstraints);
|
|
||||||
add(new JBLabel("TeaVM can copy source code to the corresponding location,"), descriptionConstraints);
|
|
||||||
add(new JBLabel("which is very convenient if you are going to debug in the browser."), descriptionConstraints);
|
|
||||||
add(copySourcesField, fieldConstraints);
|
|
||||||
|
|
||||||
GridBagConstraints constraints = new GridBagConstraints();
|
|
||||||
constraints.fill = GridBagConstraints.BOTH;
|
|
||||||
constraints.weighty = 100;
|
|
||||||
constraints.weightx = 1;
|
|
||||||
|
|
||||||
JPanel propertiesPanel = new JPanel(new BorderLayout());
|
|
||||||
propertiesPanel.setBorder(IdeBorderFactory.createTitledBorder("Properties"));
|
|
||||||
propertiesPanel.add(ToolbarDecorator.createDecorator(propertiesTable).createPanel(), BorderLayout.CENTER);
|
|
||||||
|
|
||||||
add(propertiesPanel, constraints);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static JBLabel bold(JBLabel label) {
|
|
||||||
label.setFont(label.getFont().deriveFont(Font.BOLD));
|
|
||||||
return label;
|
|
||||||
}
|
|
||||||
|
|
||||||
void load(TeaVMJpsConfiguration config) {
|
|
||||||
if (config == null) {
|
|
||||||
config = new TeaVMJpsConfiguration();
|
|
||||||
}
|
|
||||||
updateInitialConfiguration(config);
|
|
||||||
for (Field<?> field : fields) {
|
|
||||||
loadField(field, config);
|
|
||||||
}
|
|
||||||
|
|
||||||
copyProperties(config.getProperties(), propertiesModel.getProperties());
|
|
||||||
}
|
|
||||||
|
|
||||||
void save(TeaVMJpsConfiguration config) {
|
|
||||||
for (Field<?> field : fields) {
|
|
||||||
saveField(field, config);
|
|
||||||
}
|
|
||||||
copyProperties(propertiesModel.getProperties(), config.getProperties());
|
|
||||||
updateInitialConfiguration(config);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean isModified() {
|
|
||||||
return fields.stream().anyMatch(this::isFieldModified) || arePropertiesModified();
|
|
||||||
}
|
|
||||||
|
|
||||||
private <T> boolean isFieldModified(Field<T> field) {
|
|
||||||
return !Objects.equals(field.dataSupplier.apply(initialConfiguration), field.editSupplier.get());
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean arePropertiesModified() {
|
|
||||||
if (initialConfiguration.getProperties().size() != propertiesModel.getProperties().size()) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < initialConfiguration.getProperties().size(); ++i) {
|
|
||||||
TeaVMProperty initialProperty = initialConfiguration.getProperties().get(i);
|
|
||||||
TeaVMProperty property = propertiesModel.getProperties().get(i);
|
|
||||||
if (!initialProperty.getKey().equals(property.getKey())
|
|
||||||
|| !initialProperty.getValue().equals(property.getValue())) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateInitialConfiguration(TeaVMJpsConfiguration config) {
|
|
||||||
for (Field<?> field : fields) {
|
|
||||||
copyField(field, config);
|
|
||||||
}
|
|
||||||
|
|
||||||
copyProperties(config.getProperties(), initialConfiguration.getProperties());
|
|
||||||
}
|
|
||||||
|
|
||||||
private void copyProperties(List<TeaVMProperty> from, List<TeaVMProperty> to) {
|
|
||||||
to.clear();
|
|
||||||
to.addAll(from.stream().map(property -> property.createCopy()).collect(Collectors.toList()));
|
|
||||||
}
|
|
||||||
|
|
||||||
private <T> void copyField(Field<T> field, TeaVMJpsConfiguration config) {
|
|
||||||
field.dataConsumer.accept(initialConfiguration, field.dataSupplier.apply(config));
|
|
||||||
}
|
|
||||||
|
|
||||||
private <T> void loadField(Field<T> field, TeaVMJpsConfiguration config) {
|
|
||||||
field.editConsumer.accept(field.dataSupplier.apply(config));
|
|
||||||
}
|
|
||||||
|
|
||||||
private <T> void saveField(Field<T> field, TeaVMJpsConfiguration config) {
|
|
||||||
field.dataConsumer.accept(config, field.editSupplier.get());
|
|
||||||
}
|
|
||||||
|
|
||||||
private void chooseMainClass() {
|
|
||||||
TreeClassChooser chooser = TreeClassChooserFactory
|
|
||||||
.getInstance(project)
|
|
||||||
.createWithInnerClassesScopeChooser("Choose main class",
|
|
||||||
GlobalSearchScope.allScope(project), this::isMainClass, null);
|
|
||||||
chooser.showDialog();
|
|
||||||
PsiClass cls = chooser.getSelected();
|
|
||||||
if (cls != null) {
|
|
||||||
mainClassField.setText(cls.getQualifiedName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isMainClass(PsiClass cls) {
|
|
||||||
return ApplicationManager.getApplication().runReadAction((Computable<Boolean>) () -> {
|
|
||||||
return PsiMethodUtil.MAIN_CLASS.value(cls) && PsiMethodUtil.hasMainMethod(cls);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class ComboBoxItem<T> {
|
|
||||||
final T value;
|
|
||||||
private final String title;
|
|
||||||
|
|
||||||
ComboBoxItem(T value, String title) {
|
|
||||||
this.value = value;
|
|
||||||
this.title = title;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return title;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class Field<T> {
|
|
||||||
final BiConsumer<TeaVMJpsConfiguration, T> dataConsumer;
|
|
||||||
final Function<TeaVMJpsConfiguration, T> dataSupplier;
|
|
||||||
final Consumer<T> editConsumer;
|
|
||||||
final Supplier<T> editSupplier;
|
|
||||||
|
|
||||||
Field(BiConsumer<TeaVMJpsConfiguration, T> dataConsumer, Function<TeaVMJpsConfiguration, T> dataSupplier,
|
|
||||||
Consumer<T> editConsumer, Supplier<T> editSupplier) {
|
|
||||||
this.dataConsumer = dataConsumer;
|
|
||||||
this.dataSupplier = dataSupplier;
|
|
||||||
this.editConsumer = editConsumer;
|
|
||||||
this.editSupplier = editSupplier;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class PropertiesModel extends AbstractTableModel implements EditableModel {
|
|
||||||
private List<TeaVMProperty> properties = new ArrayList<>();
|
|
||||||
|
|
||||||
List<TeaVMProperty> getProperties() {
|
|
||||||
return properties;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void addRow() {
|
|
||||||
properties.add(new TeaVMProperty());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void exchangeRows(int oldIndex, int newIndex) {
|
|
||||||
TeaVMProperty old = properties.get(oldIndex);
|
|
||||||
properties.set(oldIndex, properties.get(newIndex));
|
|
||||||
properties.set(newIndex, old);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean canExchangeRows(int oldIndex, int newIndex) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void removeRow(int idx) {
|
|
||||||
properties.remove(idx);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getRowCount() {
|
|
||||||
return properties.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getColumnCount() {
|
|
||||||
return 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getColumnName(int column) {
|
|
||||||
switch (column) {
|
|
||||||
case 0:
|
|
||||||
return "Name";
|
|
||||||
case 1:
|
|
||||||
return "Value";
|
|
||||||
default:
|
|
||||||
throw new IllegalArgumentException();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Object getValueAt(int rowIndex, int columnIndex) {
|
|
||||||
switch (columnIndex) {
|
|
||||||
case 0:
|
|
||||||
return properties.get(rowIndex).getKey();
|
|
||||||
case 1:
|
|
||||||
return properties.get(rowIndex).getValue();
|
|
||||||
default:
|
|
||||||
throw new IllegalArgumentException();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
|
|
||||||
switch (columnIndex) {
|
|
||||||
case 0:
|
|
||||||
properties.get(rowIndex).setKey((String) aValue);
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
properties.get(rowIndex).setValue((String) aValue);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw new IllegalArgumentException();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isCellEditable(int rowIndex, int columnIndex) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,63 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.ui;
|
|
||||||
|
|
||||||
import com.intellij.facet.ui.FacetEditorTab;
|
|
||||||
import com.intellij.openapi.module.Module;
|
|
||||||
import javax.swing.JComponent;
|
|
||||||
import org.jetbrains.annotations.Nls;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.teavm.idea.jps.model.TeaVMJpsConfiguration;
|
|
||||||
|
|
||||||
public class TeaVMFacetEditorTab extends FacetEditorTab {
|
|
||||||
private TeaVMConfigurable configurable;
|
|
||||||
|
|
||||||
public TeaVMFacetEditorTab(Module module, TeaVMJpsConfiguration configuration) {
|
|
||||||
configurable = new TeaVMConfigurable(module, configuration);
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public JComponent createComponent() {
|
|
||||||
return configurable.createComponent();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nls
|
|
||||||
@Override
|
|
||||||
public String getDisplayName() {
|
|
||||||
return "General settings";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isModified() {
|
|
||||||
return configurable.isModified();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void apply() {
|
|
||||||
configurable.apply();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void disposeUIResources() {
|
|
||||||
configurable.disposeUIResources();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void reset() {
|
|
||||||
configurable.reset();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,143 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2017 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.ui;
|
|
||||||
|
|
||||||
import com.intellij.openapi.application.ApplicationManager;
|
|
||||||
import com.intellij.openapi.options.SearchableConfigurable;
|
|
||||||
import java.awt.GridBagConstraints;
|
|
||||||
import java.awt.GridBagLayout;
|
|
||||||
import java.text.DecimalFormat;
|
|
||||||
import javax.swing.JCheckBox;
|
|
||||||
import javax.swing.JComponent;
|
|
||||||
import javax.swing.JFormattedTextField;
|
|
||||||
import javax.swing.JLabel;
|
|
||||||
import javax.swing.JPanel;
|
|
||||||
import org.jetbrains.annotations.Nls;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
import org.teavm.idea.TeaVMDaemonComponent;
|
|
||||||
|
|
||||||
public class TeaVMSettingsEditorTab implements SearchableConfigurable {
|
|
||||||
private JPanel contentPane;
|
|
||||||
private JCheckBox daemonCheckBox;
|
|
||||||
private JFormattedTextField daemonMemoryField;
|
|
||||||
private JCheckBox incrementalCheckBox;
|
|
||||||
private TeaVMDaemonComponent daemonComponent;
|
|
||||||
|
|
||||||
public TeaVMSettingsEditorTab() {
|
|
||||||
this.daemonComponent = ApplicationManager.getApplication().getComponent(TeaVMDaemonComponent.class);
|
|
||||||
|
|
||||||
contentPane = new JPanel();
|
|
||||||
daemonCheckBox = new JCheckBox("use build daemon (can increase performance in most cases)");
|
|
||||||
JLabel daemonMemoryLabel = new JLabel("Daemon memory size (in megabytes): ");
|
|
||||||
daemonMemoryField = new JFormattedTextField(new DecimalFormat("#"));
|
|
||||||
incrementalCheckBox = new JCheckBox("incremental build (only available with daemon)");
|
|
||||||
contentPane.setLayout(new GridBagLayout());
|
|
||||||
|
|
||||||
daemonCheckBox.addActionListener(e -> incrementalCheckBox.setEnabled(daemonCheckBox.isSelected()));
|
|
||||||
|
|
||||||
GridBagConstraints labelConstraints = new GridBagConstraints();
|
|
||||||
labelConstraints.gridwidth = GridBagConstraints.REMAINDER;
|
|
||||||
labelConstraints.anchor = GridBagConstraints.WEST;
|
|
||||||
labelConstraints.weightx = 1;
|
|
||||||
labelConstraints.weighty = 1;
|
|
||||||
labelConstraints.insets.left = 5;
|
|
||||||
labelConstraints.insets.right = 5;
|
|
||||||
|
|
||||||
GridBagConstraints fieldLabelConstraints = (GridBagConstraints) labelConstraints.clone();
|
|
||||||
fieldLabelConstraints.gridwidth = GridBagConstraints.RELATIVE;
|
|
||||||
fieldLabelConstraints.weightx = 0;
|
|
||||||
|
|
||||||
contentPane.add(daemonCheckBox, labelConstraints);
|
|
||||||
contentPane.add(daemonMemoryLabel, fieldLabelConstraints);
|
|
||||||
contentPane.add(daemonMemoryField, labelConstraints);
|
|
||||||
contentPane.add(incrementalCheckBox, labelConstraints);
|
|
||||||
|
|
||||||
GridBagConstraints constraints = new GridBagConstraints();
|
|
||||||
constraints.fill = GridBagConstraints.BOTH;
|
|
||||||
constraints.weighty = 100;
|
|
||||||
constraints.weightx = 1;
|
|
||||||
contentPane.add(new JPanel(), constraints);
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public String getId() {
|
|
||||||
return "project.teavm.settings";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nls
|
|
||||||
@Override
|
|
||||||
public String getDisplayName() {
|
|
||||||
return "TeaVM";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
@Override
|
|
||||||
public String getHelpTopic() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
@Override
|
|
||||||
public JComponent createComponent() {
|
|
||||||
return contentPane;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isModified() {
|
|
||||||
return daemonCheckBox.isSelected() != daemonComponent.isDaemonRunning()
|
|
||||||
|| incrementalCheckBox.isSelected() != daemonComponent.isIncremental()
|
|
||||||
|| ((Number) daemonMemoryField.getValue()).intValue() != daemonComponent.getDaemonMemory();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void apply() {
|
|
||||||
boolean shouldRestartDaemon = true;
|
|
||||||
|
|
||||||
int newDaemonMemory = ((Number) daemonMemoryField.getValue()).intValue();
|
|
||||||
if (incrementalCheckBox.isSelected() != daemonComponent.isIncremental()
|
|
||||||
|| newDaemonMemory != daemonComponent.getDaemonMemory()) {
|
|
||||||
shouldRestartDaemon = true;
|
|
||||||
}
|
|
||||||
daemonComponent.setIncremental(incrementalCheckBox.isSelected());
|
|
||||||
daemonComponent.setDaemonMemory(newDaemonMemory);
|
|
||||||
|
|
||||||
if (daemonCheckBox.isSelected()) {
|
|
||||||
if (!daemonComponent.isDaemonRunning()) {
|
|
||||||
daemonComponent.startDaemon();
|
|
||||||
shouldRestartDaemon = false;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
daemonComponent.stopDaemon();
|
|
||||||
shouldRestartDaemon = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (shouldRestartDaemon) {
|
|
||||||
daemonComponent.stopDaemon();
|
|
||||||
daemonComponent.startDaemon();
|
|
||||||
}
|
|
||||||
|
|
||||||
daemonComponent.applyChanges();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void reset() {
|
|
||||||
daemonCheckBox.setSelected(daemonComponent.isDaemonRunning());
|
|
||||||
incrementalCheckBox.setSelected(daemonComponent.isIncremental());
|
|
||||||
daemonMemoryField.setValue(daemonComponent.getDaemonMemory());
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,21 +0,0 @@
|
||||||
<!--
|
|
||||||
~ Copyright 2017 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.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<idea-plugin>
|
|
||||||
<extensions defaultExtensionNs="org.jetbrains.idea.maven">
|
|
||||||
<importer implementation="org.teavm.idea.maven.TeaVMMavenImporter"/>
|
|
||||||
</extensions>
|
|
||||||
</idea-plugin>
|
|
|
@ -1,33 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<module type="PLUGIN_MODULE" version="4">
|
|
||||||
<component name="CheckStyle-IDEA-Module">
|
|
||||||
<option name="configuration">
|
|
||||||
<map />
|
|
||||||
</option>
|
|
||||||
</component>
|
|
||||||
<component name="DevKit.ModuleBuildProperties" url="file://$MODULE_DIR$/src/main/resources/META-INF/plugin.xml" />
|
|
||||||
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
|
|
||||||
<output url="file://$MODULE_DIR$/target/classes" />
|
|
||||||
<output-test url="file://$MODULE_DIR$/target/test-classes" />
|
|
||||||
<content url="file://$MODULE_DIR$">
|
|
||||||
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
|
|
||||||
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
|
|
||||||
<excludeFolder url="file://$MODULE_DIR$/target" />
|
|
||||||
</content>
|
|
||||||
<orderEntry type="jdk" jdkName="IntelliJ IDEA" jdkType="IDEA JDK" />
|
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
|
||||||
<orderEntry type="module" module-name="teavm-jps-common" />
|
|
||||||
<orderEntry type="module" module-name="teavm-jps-plugin" exported="" scope="RUNTIME" />
|
|
||||||
<orderEntry type="module-library" exported="">
|
|
||||||
<library>
|
|
||||||
<CLASSES>
|
|
||||||
<root url="jar://$MODULE_DIR$/../idea-artifacts/dependencies/teavm.jar!/" />
|
|
||||||
</CLASSES>
|
|
||||||
<JAVADOC />
|
|
||||||
<SOURCES>
|
|
||||||
<root url="file://$MODULE_DIR$/../../../core/src/main/java" />
|
|
||||||
</SOURCES>
|
|
||||||
</library>
|
|
||||||
</orderEntry>
|
|
||||||
</component>
|
|
||||||
</module>
|
|
|
@ -1,50 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!--
|
|
||||||
~ Copyright 2017 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.
|
|
||||||
-->
|
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<parent>
|
|
||||||
<artifactId>teavm</artifactId>
|
|
||||||
<groupId>org.teavm</groupId>
|
|
||||||
<version>0.7.0-SNAPSHOT</version>
|
|
||||||
<relativePath>../../pom.xml</relativePath>
|
|
||||||
</parent>
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
|
|
||||||
<artifactId>teavm-idea-parent</artifactId>
|
|
||||||
<name>TeaVM IDEA plugin parent</name>
|
|
||||||
<packaging>pom</packaging>
|
|
||||||
|
|
||||||
<properties>
|
|
||||||
<idea.artifacts.dir>${basedir}</idea.artifacts.dir>
|
|
||||||
</properties>
|
|
||||||
|
|
||||||
<repositories>
|
|
||||||
<repository>
|
|
||||||
<id>IDEA</id>
|
|
||||||
<url>file://${idea.artifacts.dir}/idea-artifacts/dependencies/maven</url>
|
|
||||||
</repository>
|
|
||||||
</repositories>
|
|
||||||
|
|
||||||
<modules>
|
|
||||||
<module>idea-artifacts</module>
|
|
||||||
<module>jps-common</module>
|
|
||||||
<module>jps-plugin</module>
|
|
||||||
<module>plugin</module>
|
|
||||||
</modules>
|
|
||||||
|
|
||||||
</project>
|
|
1
tools/idea/settings.gradle.kts
Normal file
1
tools/idea/settings.gradle.kts
Normal file
|
@ -0,0 +1 @@
|
||||||
|
rootProject.name = "teavm-idea"
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2018 Alexey Andreev.
|
* Copyright 2022 Alexey Andreev.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -63,7 +63,7 @@ public final class DaemonUtil {
|
||||||
if (plugin.getPluginId().compareTo(id) == 0) {
|
if (plugin.getPluginId().compareTo(id) == 0) {
|
||||||
Set<File> visited = new HashSet<>();
|
Set<File> visited = new HashSet<>();
|
||||||
List<String> classPath = new ArrayList<>();
|
List<String> classPath = new ArrayList<>();
|
||||||
findInHierarchy(plugin.getPath(), classPath, visited);
|
findInHierarchy(plugin.getPluginPath().toFile(), classPath, visited);
|
||||||
return classPath;
|
return classPath;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2018 Alexey Andreev.
|
* Copyright 2022 Alexey Andreev.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2017 Alexey Andreev.
|
* Copyright 2022 Alexey Andreev.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2016 Alexey Andreev.
|
* Copyright 2022 Alexey Andreev.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -28,7 +28,7 @@ import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.teavm.idea.debug.ui.TeaVMDebugSettingsEditor;
|
import org.teavm.idea.debug.ui.TeaVMDebugSettingsEditor;
|
||||||
|
|
||||||
public class TeaVMDebugConfiguration extends LocatableConfigurationBase
|
public class TeaVMDebugConfiguration extends LocatableConfigurationBase<TeaVMDebugConfiguration>
|
||||||
implements RunConfigurationWithSuppressedDefaultRunAction {
|
implements RunConfigurationWithSuppressedDefaultRunAction {
|
||||||
private int port = 2357;
|
private int port = 2357;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2016 Alexey Andreev.
|
* Copyright 2022 Alexey Andreev.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2016 Alexey Andreev.
|
* Copyright 2022 Alexey Andreev.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -20,8 +20,6 @@ import com.intellij.execution.ui.ExecutionConsole;
|
||||||
import com.intellij.icons.AllIcons;
|
import com.intellij.icons.AllIcons;
|
||||||
import com.intellij.openapi.application.Application;
|
import com.intellij.openapi.application.Application;
|
||||||
import com.intellij.openapi.application.ApplicationManager;
|
import com.intellij.openapi.application.ApplicationManager;
|
||||||
import com.intellij.openapi.extensions.ExtensionPoint;
|
|
||||||
import com.intellij.openapi.extensions.Extensions;
|
|
||||||
import com.intellij.openapi.util.Key;
|
import com.intellij.openapi.util.Key;
|
||||||
import com.intellij.xdebugger.XDebugProcess;
|
import com.intellij.xdebugger.XDebugProcess;
|
||||||
import com.intellij.xdebugger.XDebugSession;
|
import com.intellij.xdebugger.XDebugSession;
|
||||||
|
@ -93,8 +91,8 @@ public class TeaVMDebugProcess extends XDebugProcess {
|
||||||
breakpointHandlers.add(new TeaVMLineBreakpointHandler<>(JavaLineBreakpointType.class, session.getProject(),
|
breakpointHandlers.add(new TeaVMLineBreakpointHandler<>(JavaLineBreakpointType.class, session.getProject(),
|
||||||
innerDebugger, this));
|
innerDebugger, this));
|
||||||
|
|
||||||
ExtensionPoint<TeaVMBreakpointProvider<?>> breakpointProvider = Extensions.getArea(
|
var breakpointProvider = session.getProject().getExtensionArea()
|
||||||
session.getProject()).getExtensionPoint("org.teavm.extensions.breakpointProvider");
|
.<TeaVMBreakpointProvider<?>>getExtensionPoint("org.teavm.extensions.breakpointProvider");
|
||||||
if (breakpointProvider != null) {
|
if (breakpointProvider != null) {
|
||||||
for (TeaVMBreakpointProvider<?> provider : breakpointProvider.getExtensions()) {
|
for (TeaVMBreakpointProvider<?> provider : breakpointProvider.getExtensions()) {
|
||||||
breakpointHandlers.add(new TeaVMLineBreakpointHandler<>(provider.getBreakpointType(),
|
breakpointHandlers.add(new TeaVMLineBreakpointHandler<>(provider.getBreakpointType(),
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2016 Alexey Andreev.
|
* Copyright 2022 Alexey Andreev.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2016 Alexey Andreev.
|
* Copyright 2022 Alexey Andreev.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2016 Alexey Andreev.
|
* Copyright 2022 Alexey Andreev.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2017 Alexey Andreev.
|
* Copyright 2022 Alexey Andreev.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2016 Alexey Andreev.
|
* Copyright 2022 Alexey Andreev.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2018 Alexey Andreev.
|
* Copyright 2022 Alexey Andreev.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2016 Alexey Andreev.
|
* Copyright 2022 Alexey Andreev.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2017 Alexey Andreev.
|
* Copyright 2022 Alexey Andreev.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2016 Alexey Andreev.
|
* Copyright 2022 Alexey Andreev.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2016 Alexey Andreev.
|
* Copyright 2022 Alexey Andreev.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
|
@ -0,0 +1,57 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2022 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.debug;
|
||||||
|
|
||||||
|
import com.intellij.util.PlatformIcons;
|
||||||
|
import com.intellij.xdebugger.frame.XCompositeNode;
|
||||||
|
import com.intellij.xdebugger.frame.XNamedValue;
|
||||||
|
import com.intellij.xdebugger.frame.XValueNode;
|
||||||
|
import com.intellij.xdebugger.frame.XValuePlace;
|
||||||
|
import javax.swing.Icon;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.teavm.debugging.Value;
|
||||||
|
|
||||||
|
public class TeaVMValue extends XNamedValue {
|
||||||
|
private boolean root;
|
||||||
|
private Value innerValue;
|
||||||
|
|
||||||
|
public TeaVMValue(@NotNull String name, boolean root, Value innerValue) {
|
||||||
|
super(name);
|
||||||
|
this.root = root;
|
||||||
|
this.innerValue = innerValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void computePresentation(@NotNull XValueNode node, @NotNull XValuePlace place) {
|
||||||
|
Icon icon = root ? PlatformIcons.VARIABLE_ICON : PlatformIcons.FIELD_ICON;
|
||||||
|
innerValue.getRepresentation()
|
||||||
|
.then(representation -> representation != null ? representation : "null")
|
||||||
|
.thenVoid(representation -> {
|
||||||
|
innerValue.getType().thenVoid(type -> {
|
||||||
|
innerValue.hasInnerStructure().then(innerStructure -> {
|
||||||
|
node.setPresentation(icon, type, representation, innerStructure);
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void computeChildren(@NotNull XCompositeNode node) {
|
||||||
|
TeaVMStackFrame.computeChildrenImpl(node, innerValue.getProperties(), false);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2016 Alexey Andreev.
|
* Copyright 2022 Alexey Andreev.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2016 Alexey Andreev.
|
* Copyright 2022 Alexey Andreev.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2018 Alexey Andreev.
|
* Copyright 2022 Alexey Andreev.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2018 Alexey Andreev.
|
* Copyright 2022 Alexey Andreev.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2018 Alexey Andreev.
|
* Copyright 2022 Alexey Andreev.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2018 Alexey Andreev.
|
* Copyright 2022 Alexey Andreev.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2018 Alexey Andreev.
|
* Copyright 2022 Alexey Andreev.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2018 Alexey Andreev.
|
* Copyright 2022 Alexey Andreev.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2018 Alexey Andreev.
|
* Copyright 2022 Alexey Andreev.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -37,7 +37,7 @@ import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.teavm.idea.devserver.ui.TeaVMDevServerSettingsEditor;
|
import org.teavm.idea.devserver.ui.TeaVMDevServerSettingsEditor;
|
||||||
|
|
||||||
public class TeaVMDevServerConfiguration extends ModuleBasedConfiguration<RunConfigurationModule> {
|
public class TeaVMDevServerConfiguration extends ModuleBasedConfiguration<RunConfigurationModule, Object> {
|
||||||
private String mainClass = "";
|
private String mainClass = "";
|
||||||
private String jdkPath;
|
private String jdkPath;
|
||||||
private int port = 9090;
|
private int port = 9090;
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2018 Alexey Andreev.
|
* Copyright 2022 Alexey Andreev.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2018 Alexey Andreev.
|
* Copyright 2022 Alexey Andreev.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -20,7 +20,6 @@ import com.intellij.execution.ExecutionException;
|
||||||
import com.intellij.execution.ExecutionResult;
|
import com.intellij.execution.ExecutionResult;
|
||||||
import com.intellij.execution.Executor;
|
import com.intellij.execution.Executor;
|
||||||
import com.intellij.execution.configurations.RunProfileState;
|
import com.intellij.execution.configurations.RunProfileState;
|
||||||
import com.intellij.execution.configurations.SearchScopeProvider;
|
|
||||||
import com.intellij.execution.executors.DefaultDebugExecutor;
|
import com.intellij.execution.executors.DefaultDebugExecutor;
|
||||||
import com.intellij.execution.filters.TextConsoleBuilder;
|
import com.intellij.execution.filters.TextConsoleBuilder;
|
||||||
import com.intellij.execution.filters.TextConsoleBuilderFactory;
|
import com.intellij.execution.filters.TextConsoleBuilderFactory;
|
||||||
|
@ -34,6 +33,7 @@ import com.intellij.openapi.roots.OrderEnumerator;
|
||||||
import com.intellij.openapi.vfs.JarFileSystem;
|
import com.intellij.openapi.vfs.JarFileSystem;
|
||||||
import com.intellij.openapi.vfs.VirtualFile;
|
import com.intellij.openapi.vfs.VirtualFile;
|
||||||
import com.intellij.psi.search.GlobalSearchScope;
|
import com.intellij.psi.search.GlobalSearchScope;
|
||||||
|
import com.intellij.psi.search.GlobalSearchScopes;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.Socket;
|
import java.net.Socket;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
@ -53,7 +53,7 @@ public class TeaVMDevServerRunState implements RunProfileState {
|
||||||
this.configuration = configuration;
|
this.configuration = configuration;
|
||||||
|
|
||||||
project = environment.getProject();
|
project = environment.getProject();
|
||||||
GlobalSearchScope searchScope = SearchScopeProvider.createSearchScope(project, environment.getRunProfile());
|
GlobalSearchScope searchScope = GlobalSearchScopes.executionScope(project, environment.getRunProfile());
|
||||||
consoleBuilder = TextConsoleBuilderFactory.getInstance().createBuilder(project, searchScope);
|
consoleBuilder = TextConsoleBuilderFactory.getInstance().createBuilder(project, searchScope);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2018 Alexey Andreev.
|
* Copyright 2022 Alexey Andreev.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2018 Alexey Andreev.
|
* Copyright 2022 Alexey Andreev.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2018 Alexey Andreev.
|
* Copyright 2022 Alexey Andreev.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2018 Alexey Andreev.
|
* Copyright 2022 Alexey Andreev.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2018 Alexey Andreev.
|
* Copyright 2022 Alexey Andreev.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
|
@ -5,7 +5,6 @@
|
||||||
<vendor email="info@teavm.org" url="http://teavm.org">TeaVM community</vendor>
|
<vendor email="info@teavm.org" url="http://teavm.org">TeaVM community</vendor>
|
||||||
|
|
||||||
<depends>com.intellij.modules.java</depends>
|
<depends>com.intellij.modules.java</depends>
|
||||||
<depends optional="true" config-file="maven.xml">org.jetbrains.idea.maven</depends>
|
|
||||||
<depends optional="true" config-file="kotlin.xml">org.jetbrains.kotlin</depends>
|
<depends optional="true" config-file="kotlin.xml">org.jetbrains.kotlin</depends>
|
||||||
<depends optional="true" config-file="scala.xml">org.intellij.scala</depends>
|
<depends optional="true" config-file="scala.xml">org.intellij.scala</depends>
|
||||||
|
|
||||||
|
@ -17,22 +16,10 @@
|
||||||
]]>
|
]]>
|
||||||
</change-notes>
|
</change-notes>
|
||||||
|
|
||||||
<idea-version since-build="182.5262.2"/>
|
<idea-version since-build="201.8743.12"/>
|
||||||
|
|
||||||
<application-components>
|
|
||||||
<component>
|
|
||||||
<implementation-class>org.teavm.idea.TeaVMJPSRemoteService</implementation-class>
|
|
||||||
</component>
|
|
||||||
<component>
|
|
||||||
<implementation-class>org.teavm.idea.TeaVMDaemonComponent</implementation-class>
|
|
||||||
</component>
|
|
||||||
</application-components>
|
|
||||||
|
|
||||||
<extensions defaultExtensionNs="com.intellij">
|
<extensions defaultExtensionNs="com.intellij">
|
||||||
<applicationService serviceImplementation="org.teavm.idea.TeaVMWorkspaceConfigurationStorage"/>
|
|
||||||
|
|
||||||
<compileServer.plugin classpath="jps/teavm-jps-plugin.jar;teavm.jar;teavm-jps-common.jar"/>
|
|
||||||
<buildProcess.parametersProvider implementation="org.teavm.idea.TeaVMJPSConfigurator"/>
|
|
||||||
<configurationType implementation="org.teavm.idea.debug.TeaVMDebugConfigurationType"/>
|
<configurationType implementation="org.teavm.idea.debug.TeaVMDebugConfigurationType"/>
|
||||||
<programRunner implementation="org.teavm.idea.debug.TeaVMDebugRunner"/>
|
<programRunner implementation="org.teavm.idea.debug.TeaVMDebugRunner"/>
|
||||||
|
|
||||||
|
@ -43,9 +30,6 @@
|
||||||
id="project.teavm.settings"
|
id="project.teavm.settings"
|
||||||
displayName="TeaVM compiler"
|
displayName="TeaVM compiler"
|
||||||
parentId="project.propCompiler"/>
|
parentId="project.propCompiler"/>
|
||||||
|
|
||||||
<facetType implementation="org.teavm.idea.TeaVMFacetType"/>
|
|
||||||
<facetType implementation="org.teavm.idea.TeaVMWebAssemblyFacetType"/>
|
|
||||||
</extensions>
|
</extensions>
|
||||||
|
|
||||||
<extensionPoints>
|
<extensionPoints>
|
Before Width: | Height: | Size: 713 B After Width: | Height: | Size: 713 B |
|
@ -1,12 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
|
|
||||||
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_5">
|
|
||||||
<output url="file://$MODULE_DIR$/target/classes" />
|
|
||||||
<output-test url="file://$MODULE_DIR$/target/test-classes" />
|
|
||||||
<content url="file://$MODULE_DIR$">
|
|
||||||
<excludeFolder url="file://$MODULE_DIR$/target" />
|
|
||||||
</content>
|
|
||||||
<orderEntry type="inheritedJdk" />
|
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
|
||||||
</component>
|
|
||||||
</module>
|
|
Loading…
Reference in New Issue
Block a user