Skip to content

Commit

Permalink
Support query string in idea plugin
Browse files Browse the repository at this point in the history
  • Loading branch information
JornVernee committed Jan 13, 2025
1 parent 6149386 commit 95d0f52
Show file tree
Hide file tree
Showing 6 changed files with 148 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ public class JTRegConfiguration extends JavaTestConfigurationBase {
private boolean alternativeJrePathEnabled;
private String alternativeJrePath;
private String file;
private String query;
private String directory;
private String workDirectory;

Expand Down Expand Up @@ -218,6 +219,14 @@ public void setRunClass(String file) {
this.file = file;
}

public String getQuery() {
return query;
}

public void setQuery(String query) {
this.query = query;
}

@Nullable
@Override
public String getPackage() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@
import com.intellij.execution.*;
import com.intellij.execution.configurations.JavaParameters;
import com.intellij.execution.configurations.ParametersList;
import com.intellij.execution.configurations.RuntimeConfigurationError;
import com.intellij.execution.configurations.RuntimeConfigurationException;
import com.intellij.execution.process.KillableColoredProcessHandler;
import com.intellij.execution.process.OSProcessHandler;
Expand All @@ -37,16 +36,11 @@
import com.intellij.execution.runners.ProgramRunner;
import com.intellij.execution.testframework.SearchForTestsTask;
import com.intellij.execution.testframework.TestSearchScope;
import com.intellij.execution.ui.DefaultJreSelector;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.projectRoots.JdkUtil;
import com.intellij.openapi.projectRoots.ProjectJdkTable;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.util.PathUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import com.oracle.plugin.jtreg.executors.JTRegDebuggerRunner;
import com.oracle.plugin.jtreg.runtime.JTRegTestListener;
import com.oracle.plugin.jtreg.service.JTRegService;

import java.io.File;
Expand Down Expand Up @@ -148,7 +142,11 @@ protected JavaParameters createJavaParameters() throws ExecutionException {
javaParameters.getProgramParametersList().add("-o:com.oracle.plugin.jtreg.runtime.JTRegTestListener");
javaParameters.getProgramParametersList().add("-od:" + PathUtil.getJarPathForClass(JTRegConfiguration.class));
if (getConfiguration().getRunClass() != null) {
javaParameters.getProgramParametersList().add(getConfiguration().getRunClass());
if (getConfiguration().getQuery() != null && !getConfiguration().getQuery().isEmpty()) {
javaParameters.getProgramParametersList().add(getConfiguration().getRunClass() + "?" + getConfiguration().getQuery());
} else {
javaParameters.getProgramParametersList().add(getConfiguration().getRunClass());
}
} else {
javaParameters.getProgramParametersList().add(getConfiguration().getPackage());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,15 +27,12 @@

import com.intellij.execution.Location;
import com.intellij.execution.actions.ConfigurationContext;
import com.intellij.lang.ant.config.AntConfiguration;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.util.Ref;
import com.intellij.psi.*;
import com.oracle.plugin.jtreg.configuration.JTRegConfiguration;
import com.oracle.plugin.jtreg.service.JTRegService;
import com.oracle.plugin.jtreg.util.JTRegUtils;
import com.oracle.plugin.jtreg.configuration.JTRegConfiguration;
import com.oracle.plugin.jtreg.service.JTRegService;

/**
* This class generates a jtreg configuration from a given file selected in the IDE.
Expand All @@ -44,8 +41,10 @@ public class JTRegClassConfigurationProducer extends JTRegConfigurationProducer

@Override
protected boolean setupConfigurationFromContext(JTRegConfiguration configuration, ConfigurationContext context, Ref<PsiElement> sourceElement) {
final Location contextLocation = context.getLocation();
final Location<PsiElement> contextLocation = context.getLocation();
assert contextLocation != null;
final PsiElement element = contextLocation.getPsiElement();

PsiFile psiFile = contextLocation.getPsiElement().getContainingFile();
if (psiFile == null ||
!JTRegUtils.isInJTRegRoot(psiFile.getContainingDirectory()) ||
Expand All @@ -59,8 +58,24 @@ protected boolean setupConfigurationFromContext(JTRegConfiguration configuration
configuration.setWorkingDirectory(JTRegService.getInstance(configuration.getProject()).getWorkDir());
configuration.setRunClass(psiFile.getVirtualFile().getPath());
configuration.restoreOriginalModule(originalModule);
configuration.setName(psiFile.getName());

configuration.setQuery(getQuery(element));
configuration.setName(nameForElement(element));

initBeforeTaskActions(configuration);
return true;
}

private static String nameForElement(PsiElement element) {
if (element instanceof PsiIdentifier
&& element.getParent() instanceof PsiMethod method) {
String className = ((PsiClass) method.getParent()).getName();
return className + "::" + method.getName();
} else if (element instanceof PsiIdentifier
&& element.getParent() instanceof PsiClass cls) {
return cls.getName();
} else {
return element.getContainingFile().getName();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,14 @@
import com.intellij.lang.ant.config.*;
import com.intellij.lang.ant.config.impl.AntBeforeRunTask;
import com.intellij.lang.ant.config.impl.AntBeforeRunTaskProvider;
import com.intellij.psi.PsiFile;
import com.intellij.psi.*;
import com.oracle.plugin.jtreg.configuration.JTRegConfiguration;
import com.oracle.plugin.jtreg.service.JTRegService;
import com.oracle.plugin.jtreg.configuration.JTRegConfigurationType;
import com.theoryinpractice.testng.configuration.TestNGConfiguration;

import java.util.List;
import java.util.StringJoiner;
import java.util.stream.Collectors;

/**
Expand All @@ -65,10 +66,90 @@ public boolean isConfigurationFromContext(JTRegConfiguration unitConfiguration,
if (location == null) {
return false;
}
PsiFile testClass = location.getPsiElement().getContainingFile();
final String runClass = unitConfiguration.getRunClass();
return runClass != null && testClass != null && testClass.getVirtualFile() != null &&
runClass.equals(testClass.getVirtualFile().getPath());

PsiElement element = location.getPsiElement();
String query = getQuery(element);
PsiFile contextFile = element.getContainingFile();
final String configFile = unitConfiguration.getRunClass();
return configFile != null && contextFile != null && contextFile.getVirtualFile() != null &&
configFile.equals(contextFile.getVirtualFile().getPath())
&& query.equals(unitConfiguration.getQuery());
}

protected static String getQuery(PsiElement element) {
if (element instanceof PsiIdentifier
&& element.getParent() instanceof PsiMethod method) {
return getMethodQuery(method);
} else if (element instanceof PsiIdentifier
&& element.getParent() instanceof PsiClass cls) {
return binaryNameFor(cls);
} else {
return "";
}
}

// construct a query string which gets pass, through jtreg, to junit/testng to select the method we want to run
private static String getMethodQuery(PsiMethod method) {
StringJoiner paramTypeNames = new StringJoiner(",");
PsiParameterList params = method.getParameterList();
for (int i = 0; i < params.getParametersCount(); i++) {
PsiParameter param = params.getParameter(i);
PsiType type = param.getType();
paramTypeNames.add(binaryNameFor(type));
}
String className = binaryNameFor(((PsiClass) method.getParent()));
return className + "::" + method.getName() + '(' + paramTypeNames + ')';
}

private static String binaryNameFor(PsiType type) {
if (type instanceof PsiPrimitiveType) {
return type.getCanonicalText();
} else if (type instanceof PsiClassType clsType) {
return binaryNameFor(clsType.resolve());
} else if (type instanceof PsiArrayType arrayType) {
return binaryNameFor(arrayType);
} else {
return type.getCanonicalText();
}
}

private static String binaryNameFor(PsiClass cls) {
// handle nested classes. Convert '.' to '$'
String nestedName = cls.getName();
PsiClass current = cls;
while ((current = current.getContainingClass()) != null) {
nestedName = current.getName() + "." + nestedName;
}
String qualName = cls.getQualifiedName();
String packageName = qualName.substring(0, qualName.length() - nestedName.length());
return packageName + nestedName.replace('.', '$');
}

private static String binaryNameFor(PsiArrayType arrayType) {
PsiType component = arrayType.getDeepComponentType();
String componentName;
if (component instanceof PsiPrimitiveType primitiveType) {
componentName = descriptorFor(primitiveType);
} else if (component instanceof PsiClassType clsType) {
componentName = "L" + binaryNameFor(clsType.resolve()) + ";";
} else {
componentName = component.getCanonicalText();
}
return "[".repeat(arrayType.getArrayDimensions()) + componentName;
}

private static String descriptorFor(PsiPrimitiveType primitiveType) {
return switch (primitiveType.getCanonicalText()) {
case "boolean" -> "Z";
case "byte" -> "B";
case "char" -> "C";
case "short" -> "S";
case "int" -> "I";
case "long" -> "J";
case "float" -> "F";
case "double" -> "D";
default -> primitiveType.getCanonicalText();
};
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,36 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.oracle.plugin.jtreg.configuration.ui.JTRegConfigurable">
<grid id="27dc6" binding="mainPane" layout-manager="GridLayoutManager" row-count="6" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<grid id="27dc6" binding="mainPane" layout-manager="GridLayoutManager" row-count="7" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<xy x="20" y="20" width="418" height="227"/>
<xy x="20" y="20" width="418" height="253"/>
</constraints>
<properties/>
<border type="none"/>
<children>
<component id="62dc1" class="com.intellij.openapi.ui.TextFieldWithBrowseButton" binding="workDirectory" custom-create="true">
<constraints>
<grid row="3" column="1" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
<grid row="4" column="1" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
</component>
<component id="f22" class="javax.swing.JTextField" binding="jtregOptions">
<constraints>
<grid row="2" column="1" row-span="1" col-span="1" vsize-policy="1" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false">
<grid row="3" column="1" row-span="1" col-span="1" vsize-policy="1" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false">
<preferred-size width="150" height="-1"/>
</grid>
</constraints>
<properties/>
</component>
<component id="26f59" class="com.intellij.execution.ui.JrePathEditor" binding="jrePathEditor" custom-create="true">
<constraints>
<grid row="4" column="0" row-span="1" col-span="2" vsize-policy="3" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
<grid row="5" column="0" row-span="1" col-span="2" vsize-policy="3" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
</component>
<vspacer id="cfbe2">
<constraints>
<grid row="5" column="0" row-span="1" col-span="2" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
<grid row="6" column="0" row-span="1" col-span="2" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
</constraints>
</vspacer>
<component id="d8563" class="com.intellij.openapi.ui.TextFieldWithBrowseButton" binding="file" custom-create="true">
Expand All @@ -47,7 +47,7 @@
</component>
<component id="690e3" class="javax.swing.JLabel">
<constraints>
<grid row="3" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false">
<grid row="4" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false">
<preferred-size width="128" height="18"/>
</grid>
</constraints>
Expand All @@ -57,7 +57,7 @@
</component>
<component id="30df8" class="javax.swing.JLabel">
<constraints>
<grid row="2" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false">
<grid row="3" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false">
<preferred-size width="128" height="18"/>
</grid>
</constraints>
Expand Down Expand Up @@ -85,6 +85,23 @@
<text value="Directory"/>
</properties>
</component>
<component id="f04ef" class="javax.swing.JTextField" binding="jtregQuery">
<constraints>
<grid row="2" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false">
<preferred-size width="150" height="-1"/>
</grid>
</constraints>
<properties/>
</component>
<component id="3696b" class="javax.swing.JLabel">
<constraints>
<grid row="2" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="Query String"/>
<toolTipText value="The query string passed to the test runner. Used for instance to select a particular test method to run in a JUnit test"/>
</properties>
</component>
</children>
</grid>
<buttonGroups>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
* This class models the dialog associated with the (project-wide) jtreg tool settings.
*/
public class JTRegConfigurable<T extends JTRegConfiguration> extends SettingsEditor<T> {
private JTextField jtregQuery;
private JTextField jtregOptions;
private TextFieldWithBrowseButton jtregDir;
private TextFieldWithBrowseButton workDirectory;
Expand Down Expand Up @@ -90,6 +91,7 @@ public void applyEditorTo(final JTRegConfiguration configuration) {
configuration.setPackage(directoryRadioButton.isSelected() ?
FileUtil.toSystemIndependentName(directory.getText().trim()) : null);
configuration.setProgramParameters(jtregOptions.getText().trim());
configuration.setQuery(jtregQuery.getText().trim());
configuration.setWorkingDirectory(workDirectory.getText().isEmpty() ?
null : FileUtil.toSystemIndependentName(workDirectory.getText().trim()));
}
Expand All @@ -107,6 +109,7 @@ public void resetEditorFrom(final JTRegConfiguration configuration) {
directory.setText(aPackage != null ? FileUtil.toSystemDependentName(aPackage) : null);
}
jtregOptions.setText(configuration.getProgramParameters());
jtregQuery.setText(configuration.getQuery());
String workDir = configuration.getWorkingDirectory();
workDirectory.setText(workDir == null ? "" : FileUtil.toSystemDependentName(workDir));
updateComponents(null);
Expand Down

0 comments on commit 95d0f52

Please sign in to comment.