New IDEA module kind based on Gradle

This commit is contained in:
Alexey Andreev 2022-12-20 20:48:16 +01:00
parent 8963b00ed4
commit 2a0f6f206e
96 changed files with 630 additions and 4539 deletions

View File

@ -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>

View 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>

View File

@ -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;

View File

@ -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

View File

@ -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
View 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
View File

@ -0,0 +1,5 @@
.gradle
build/
!gradle/wrapper/gradle-wrapper.jar
!**/src/main/**/build/
!**/src/test/**/build/

View 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.*")
}
}

Binary file not shown.

View 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
View 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
View 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

View File

@ -1 +0,0 @@
/dependencies

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -1 +0,0 @@
lib/

View File

@ -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>

View File

@ -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()));
}
}

View File

@ -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;
}
}

View File

@ -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) {
}
}
}

View File

@ -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;
}
}

View File

@ -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;
}

View File

@ -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;
}
}

View File

@ -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>

View File

@ -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>

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}
}

View File

@ -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";
}
}

View File

@ -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);
}
}

View File

@ -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;
}
}
}

View File

@ -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);
}
}

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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);
}
}
}

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -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());
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}
}

View File

@ -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();
}
}

View File

@ -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());
}
}

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -0,0 +1 @@
rootProject.name = "teavm-idea"

View File

@ -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;
} }
} }

View File

@ -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.

View File

@ -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.

View File

@ -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;

View File

@ -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.

View File

@ -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(),

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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);
}
}

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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;

View File

@ -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.

View File

@ -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);
} }

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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>

View File

Before

Width:  |  Height:  |  Size: 713 B

After

Width:  |  Height:  |  Size: 713 B

View File

@ -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>