Merge branch 'master' of git.labs.intellij.net:idea/community

This commit is contained in:
Elizaveta Shashkova
2015-03-18 15:32:36 +03:00
32 changed files with 398 additions and 57 deletions
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2014 JetBrains s.r.o.
* Copyright 2000-2015 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -396,11 +396,10 @@ public class FrameVariablesTree extends DebuggerTree {
private static TextRange calculateLimitRange(final PsiFile file, final Document doc, final int line) {
final int offset = doc.getLineStartOffset(line);
if (offset > 0) {
for (PsiElement elem = file.findElementAt(offset); elem != null; elem = elem.getParent()) {
if (elem instanceof PsiMethod) {
final TextRange elemRange = elem.getTextRange();
return new TextRange(doc.getLineNumber(elemRange.getStartOffset()), doc.getLineNumber(elemRange.getEndOffset()));
}
PsiMethod method = PsiTreeUtil.getParentOfType(file.findElementAt(offset), PsiMethod.class, false);
if (method != null) {
final TextRange elemRange = method.getTextRange();
return new TextRange(doc.getLineNumber(elemRange.getStartOffset()), doc.getLineNumber(elemRange.getEndOffset()));
}
}
return new TextRange(0, doc.getLineCount() - 1);
@@ -94,6 +94,7 @@ public class SegmentedInputStream extends InputStream {
while (nextRead != ' ' && nextRead != SegmentedStream.SPECIAL_SYMBOL) {
buffer.append((char)nextRead);
nextRead = readNext();
if (nextRead == -1) return new char[0];
}
return readNext(Integer.valueOf(buffer.toString()).intValue());
}
@@ -0,0 +1,45 @@
/*
* Copyright 2000-2015 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.codeInsight.editorActions.wordSelection;
import com.intellij.codeInsight.editorActions.ExtendWordSelectionHandler;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiMethodCallExpression;
import java.util.Collections;
import java.util.List;
public class MethodCallSelectioner implements ExtendWordSelectionHandler {
@Override
public boolean canSelect(PsiElement e) {
return e instanceof PsiMethodCallExpression;
}
@Override
public List<TextRange> select(PsiElement e, CharSequence editorText, int cursorOffset, Editor editor) {
PsiMethodCallExpression methodCall = (PsiMethodCallExpression)e;
PsiElement referenceNameElement = methodCall.getMethodExpression().getReferenceNameElement();
if (referenceNameElement == null) {
return null;
}
else {
return Collections.singletonList(new TextRange(referenceNameElement.getTextRange().getStartOffset(),
methodCall.getTextRange().getEndOffset()));
}
}
}
@@ -31,6 +31,7 @@ import com.intellij.refactoring.util.RefactoringHierarchyUtil;
import com.intellij.util.ArrayUtil;
import gnu.trove.THashMap;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.*;
@@ -333,19 +334,24 @@ public class TypeSelectorManagerImpl implements TypeSelectorManager {
typeSelected(type, getDefaultType());
}
public static void typeSelected(final PsiType type, final PsiType defaultType) {
public static void typeSelected(@NotNull final PsiType type, @Nullable final PsiType defaultType) {
if (defaultType == null) return;
StatisticsManager.getInstance().incUseCount(new StatisticsInfo(getStatsKey(defaultType), serialize(type)));
}
private String getStatsKey() {
return getStatsKey(getDefaultType());
final PsiType defaultType = getDefaultType();
if (defaultType == null) {
return "IntroduceVariable##";
}
return getStatsKey(defaultType);
}
private static String getStatsKey(final PsiType defaultType) {
return "IntroduceVariable##" + serialize(defaultType);
}
private static String serialize(PsiType type) {
private static String serialize(@NotNull PsiType type) {
if (PsiUtil.resolveClassInType(type) instanceof PsiTypeParameter) return type.getCanonicalText();
return TypeConversionUtil.erasure(type).getCanonicalText();
}
@@ -140,6 +140,11 @@ public class PsiSubstitutorImpl implements PsiSubstitutor {
return visitWildcardType(type.getWildcard());
}
@Override
public PsiType visitType(PsiType type) {
return null;
}
@Override
public PsiType visitWildcardType(PsiWildcardType wildcardType) {
final PsiType bound = wildcardType.getBound();
@@ -29,7 +29,7 @@ import java.nio.charset.CoderResult;
class Native2AsciiCharsetDecoder extends CharsetDecoder {
private static final char INVALID_CHAR = (char)-1;
private final StringBuilder myOutBuffer = new StringBuilder();
private StringBuilder myOutBuffer = new StringBuilder();
private final Charset myBaseCharset;
Native2AsciiCharsetDecoder(final Native2AsciiCharset charset) {
@@ -40,7 +40,7 @@ class Native2AsciiCharsetDecoder extends CharsetDecoder {
@Override
protected void implReset() {
super.implReset();
myOutBuffer.setLength(0);
myOutBuffer = new StringBuilder();
}
@Override
@@ -161,6 +161,7 @@ public class CompositeElement extends TreeElement {
@Override
public LeafElement findLeafElementAt(int offset) {
TreeElement element = this;
if (element.getTreeParent() == null && offset >= element.getTextLength()) return null;
startFind:
while (true) {
TreeElement child = element.getFirstChildNode();
@@ -45,7 +45,7 @@ public class DataNode<T> implements Serializable {
private static final Logger LOG = Logger.getInstance(DataNode.class);
@NotNull private final List<DataNode<?>> myChildren = ContainerUtilRt.newArrayList();
@NotNull private final List<DataNode<?>> myChildrenView = Collections.unmodifiableList(myChildren);
@NotNull private transient List<DataNode<?>> myChildrenView = Collections.unmodifiableList(myChildren);
@NotNull private final Key<T> myKey;
private transient T myData;
@@ -241,6 +241,12 @@ public class DataNode<T> implements Serializable {
out.defaultWriteObject();
}
private void readObject(ObjectInputStream in)
throws IOException, ClassNotFoundException {
in.defaultReadObject();
myChildrenView = Collections.unmodifiableList(myChildren);
}
public byte[] getDataBytes() throws IOException {
if (myRawData != null) return myRawData;
@@ -424,7 +424,7 @@ public class EnterHandler extends BaseEnterHandler {
myOffset = codeStyleManager.adjustLineIndent(myFile, myOffset);
psiDocumentManager.commitAllDocuments();
if (!StringUtil.isEmpty(indentInsideJavadoc) && myOffset < myDocument.getTextLength()) {
if (commentContext.docAsterisk && !StringUtil.isEmpty(indentInsideJavadoc) && myOffset < myDocument.getTextLength()) {
myDocument.insertString(myOffset + 1, indentInsideJavadoc);
myOffset += indentInsideJavadoc.length();
docIndentApplied = true;
@@ -35,6 +35,8 @@ import com.intellij.ui.tabs.TabInfo;
import com.intellij.ui.tabs.TabsListener;
import com.intellij.ui.tabs.UiDecorator;
import com.intellij.ui.tabs.impl.JBEditorTabs;
import com.intellij.ui.tabs.impl.singleRow.CompressibleSingleRowLayout;
import com.intellij.ui.tabs.impl.singleRow.SingleRowLayout;
import com.intellij.util.containers.HashSet;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NonNls;
@@ -80,6 +82,11 @@ public class GridCellImpl implements GridCell {
return true;
}
@Override
protected SingleRowLayout createSingleRowLayout() {
return new CompressibleSingleRowLayout(this);
}
@Override
public int tabMSize() {
return 12;
@@ -204,9 +204,7 @@ public class MultiHostRegistrarImpl implements MultiHostRegistrar, ModificationT
addToResults(new Place(shreds), null);
return;
}
PsiDocumentManagerImpl documentManager = (PsiDocumentManagerImpl)PsiDocumentManager.getInstance(myProject);
//todo restore
//assert !documentManager.getUncommittedDocumentsUnsafe().contains(myHostDocument) : "document is uncommitted: "+myHostDocument;
PsiDocumentManager documentManager = PsiDocumentManager.getInstance(myProject);
Place place = new Place(shreds);
DocumentWindowImpl documentWindow = new DocumentWindowImpl(myHostDocument, isOneLineEditor, place);
@@ -229,6 +229,9 @@ update.directories.scope.name=Directories
update.project.scope.name=Project
dialog.title.changes.browser=Changes Browser
code.smells.error.messages.tab.name=Code Analysis
code.smells.error.indexing=Code analysis is not possible right now
code.smells.error.indexing.message=Code analysis can''t be performed while {0} updates the indices in background.\n\
You can commit the changes without running inspections, or you can wait until indices are built.
searching.for.code.smells.processing.file.progress.text=Processing {0}
checking.code.smells.progress.title=Performing Code Analysis
before.commit.files.contain.code.smells.edit.them.confirm.text=Some files contain problems.\n\
@@ -19,6 +19,7 @@ package com.intellij.openapi.vcs.checkin;
import com.intellij.CommonBundle;
import com.intellij.codeInsight.CodeSmellInfo;
import com.intellij.lang.annotation.HighlightSeverity;
import com.intellij.openapi.application.ApplicationNamesInfo;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.progress.ProcessCanceledException;
import com.intellij.openapi.project.DumbService;
@@ -32,11 +33,13 @@ import com.intellij.openapi.vcs.changes.CommitExecutor;
import com.intellij.openapi.vcs.ui.RefreshableOnComponent;
import com.intellij.ui.NonFocusableCheckBox;
import com.intellij.util.PairConsumer;
import com.intellij.util.PlatformUtils;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
import java.text.MessageFormat;
import java.util.List;
/**
@@ -126,10 +129,9 @@ public class CodeAnalysisBeforeCheckinHandler extends CheckinHandler {
public ReturnResult beforeCheckin(CommitExecutor executor, PairConsumer<Object, Object> additionalDataConsumer) {
if (getSettings().CHECK_CODE_SMELLS_BEFORE_PROJECT_COMMIT) {
if (DumbService.getInstance(myProject).isDumb()) {
if (Messages.showOkCancelDialog(myProject,
"Code analysis can't be performed while IntelliJ IDEA updates the indices in background.\n" +
"You can commit the changes without running inspections, or you can wait until indices are built.",
"Code analysis is not possible right now",
if (Messages.showOkCancelDialog(myProject, VcsBundle.message("code.smells.error.indexing.message",
ApplicationNamesInfo.getInstance().getProductName()),
VcsBundle.message("code.smells.error.indexing"),
"&Wait", "&Commit", null) == Messages.OK) {
return ReturnResult.CANCEL;
}
-1
View File
@@ -9,7 +9,6 @@
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module" module-name="groovy_rt" />
<orderEntry type="library" exported="" name="Groovy" level="project" />
<orderEntry type="library" name="Guava" level="project" />
<orderEntry type="module" module-name="testFramework-java" scope="TEST" />
@@ -21,12 +21,17 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.PsiReference;
import com.intellij.psi.search.*;
import com.intellij.psi.search.searches.MethodReferencesSearch;
import com.intellij.psi.util.PropertyUtil;
import com.intellij.util.Processor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrCommandArgumentList;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrMethodCall;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression;
import org.jetbrains.plugins.groovy.lang.psi.impl.PsiImplUtil;
@@ -46,9 +51,8 @@ public class MethodLateBoundReferencesSearcher extends QueryExecutorBase<PsiRefe
@Override
public void processQuery(@NotNull MethodReferencesSearch.SearchParameters queryParameters, @NotNull Processor<PsiReference> consumer) {
final PsiMethod method = queryParameters.getMethod();
SearchScope searchScope = GroovyScopeUtil.restrictScopeToGroovyFiles(queryParameters.getEffectiveSearchScope()).intersectWith(getUseScope(method));
PsiClass aClass = method.getContainingClass();
String className = aClass == null ? null : aClass.getName();
SearchScope searchScope = GroovyScopeUtil.restrictScopeToGroovyFiles(queryParameters.getEffectiveSearchScope()).intersectWith(
getUseScope(method));
orderSearching(searchScope, method.getName(), method, queryParameters.getOptimizer(), method.getParameterList().getParametersCount());
final String propName = PropertyUtil.getPropertyName(method);
@@ -85,16 +89,29 @@ public class MethodLateBoundReferencesSearcher extends QueryExecutorBase<PsiRefe
}
final GrReferenceExpression ref = (GrReferenceExpression)element;
if (!name.equals(ref.getReferenceName()) || PsiUtil.isLValue(ref) || ref.resolve() != null) {
if (!name.equals(ref.getReferenceName()) || PsiUtil.isLValue(ref)) {
return true;
}
PsiElement parent = ref.getParent();
if (parent instanceof GrMethodCall) {
if (!argumentsMatch((GrMethodCall)parent, paramCount)) {
return true;
}
} else if (ResolveUtil.isKeyOfMap(ref)) {
if (parent instanceof GrCommandArgumentList) {
parent = parent.getParent();
}
if (paramCount >= 0 && !ref.hasMemberPointer() &&
(!(parent instanceof GrMethodCall) || !argumentsMatch((GrMethodCall)parent, paramCount))) {
return true;
}
GrExpression qualifier = ref.getQualifierExpression();
if (qualifier == null || qualifier.getType() != null) {
return true;
}
if (ref.resolve() != null) {
return true;
}
if (ResolveUtil.isKeyOfMap(ref)) {
return true;
}
@@ -104,7 +121,7 @@ public class MethodLateBoundReferencesSearcher extends QueryExecutorBase<PsiRefe
}
private static boolean argumentsMatch(GrMethodCall call, int paramCount) {
int argCount = call.getExpressionArguments().length;
int argCount = call.getExpressionArguments().length + call.getClosureArguments().length;
if (PsiImplUtil.hasNamedArguments(call.getArgumentList())) {
argCount++;
}
@@ -18,10 +18,7 @@ package org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.NullableComputable;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.RecursionManager;
import com.intellij.openapi.util.*;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.impl.source.resolve.ResolveCache;
@@ -52,6 +49,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrMethod
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.path.GrMethodCallExpression;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrAccessorMethod;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrReflectedMethod;
import org.jetbrains.plugins.groovy.lang.psi.api.toplevel.imports.GrImportStatement;
import org.jetbrains.plugins.groovy.lang.psi.api.types.GrTypeArgumentList;
import org.jetbrains.plugins.groovy.lang.psi.dataFlow.types.TypeInferenceHelper;
@@ -395,9 +393,36 @@ public class GrReferenceExpressionImpl extends GrReferenceElementImpl<GrExpressi
processMethods(shapeProcessor);
GroovyResolveResult[] candidates = shapeProcessor.getCandidates();
assertAllAreValid(candidates);
if (hasMemberPointer()) {
candidates = collapseReflectedMethods(candidates);
}
return Pair.create(shapeProcessor.hasApplicableCandidates(), candidates);
}
@NotNull
private static GroovyResolveResult[] collapseReflectedMethods(GroovyResolveResult[] candidates) {
List<GroovyResolveResult> filtered = ContainerUtil.filter(candidates, new Condition<GroovyResolveResult>() {
@Override
public boolean value(GroovyResolveResult result) {
PsiElement element = result.getElement();
return !(element instanceof GrReflectedMethod && hasMoreCompleteOverload((GrReflectedMethod)element));
}
private boolean hasMoreCompleteOverload(GrReflectedMethod element) {
final int skipped = element.getSkippedParameters().length;
return ContainerUtil.or(element.getBaseMethod().getReflectedMethods(), new Condition<GrReflectedMethod>() {
@Override
public boolean value(GrReflectedMethod method) {
return method.getSkippedParameters().length > skipped;
}
});
}
});
return filtered.toArray(new GroovyResolveResult[filtered.size()]);
}
private static void assertAllAreValid(@NotNull GroovyResolveResult[] candidates) {
for (GroovyResolveResult candidate : candidates) {
final PsiElement element = candidate.getElement();
@@ -839,7 +864,7 @@ public class GrReferenceExpressionImpl extends GrReferenceElementImpl<GrExpressi
@NotNull
private Kind getKind() {
if (getDotTokenType() == GroovyTokenTypes.mMEMBER_POINTER) return Kind.METHOD_OR_PROPERTY;
if (hasMemberPointer()) return Kind.METHOD_OR_PROPERTY;
PsiElement parent = getParent();
if (parent instanceof GrMethodCallExpression || parent instanceof GrApplicationStatement) {
@@ -151,6 +151,10 @@ public class FindUsagesTest extends LightGroovyTestCase {
doTestImpl("DynamicUsages.groovy", 2);
}
public void testDynamicCallExpressionUsages() {
doTestImpl("DynamicCallExpressionUsages.groovy", 2);
}
public void testAnnotatedMemberSearch() throws Throwable {
final PsiReference ref = myFixture.getReferenceAtCaretPosition("A.groovy");
@@ -2213,6 +2213,18 @@ class B {
def v = new B() as A
v.ba<caret>r()
''', PsiMethod)
}
void testMethodReferenceWithDefaultParameters() {
resolveByText('''
class X {
def foo(def it = null) {print it}
def bar() {
print this.&f<caret>oo
}
}
''', PsiMethod)
}
@@ -0,0 +1,9 @@
class Bar {
boolean fo<caret>o(a) { }
}
def boo(Map args, p) {
p.foo 2
p.foo { println "hello" }
}
@@ -6,6 +6,12 @@ def boo(Map args, p) {
println p.focused
println p.isFocused()
println args.focused //not a usage
// not usage candidates
println focused
println isFocused()
println "a".focused
println "a".isFocused()
println args.focused
}
@@ -41,6 +41,7 @@ import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.refactoring.listeners.RefactoringElementListener;
import com.intellij.rt.execution.junit.RepeatCount;
import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
@@ -330,6 +331,19 @@ public class JUnitConfiguration extends ModuleBasedConfiguration<JavaRunConfigur
setForkMode(mode);
}
}
final String count = element.getAttributeValue("repeat_count");
if (count != null) {
try {
setRepeatCount(Integer.parseInt(count));
}
catch (NumberFormatException e) {
setRepeatCount(1);
}
}
final String repeatMode = element.getAttributeValue("repeat_mode");
if (repeatMode != null) {
setRepeatMode(repeatMode);
}
final Element dirNameElement = element.getChild("dir");
if (dirNameElement != null) {
final String dirName = dirNameElement.getAttributeValue("value");
@@ -378,6 +392,13 @@ public class JUnitConfiguration extends ModuleBasedConfiguration<JavaRunConfigur
forkModeElement.setAttribute("value", forkMode);
element.addContent(forkModeElement);
}
if (getRepeatCount() != 1) {
element.setAttribute("repeat_count", String.valueOf(getRepeatCount()));
}
final String repeatMode = getRepeatMode();
if (!RepeatCount.ONCE.equals(repeatMode)) {
element.setAttribute("repeat_mode", repeatMode);
}
element.addContent(patternsElement);
}
@@ -430,6 +451,22 @@ public class JUnitConfiguration extends ModuleBasedConfiguration<JavaRunConfigur
setGeneratedName();
}
public void setRepeatCount(int repeatCount) {
myData.REPEAT_COUNT = repeatCount;
}
public int getRepeatCount() {
return myData.REPEAT_COUNT;
}
public void setRepeatMode(String repeatMode) {
myData.REPEAT_MODE = repeatMode;
}
public String getRepeatMode() {
return myData.REPEAT_MODE;
}
public static class Data implements Cloneable {
public String PACKAGE_NAME;
private String DIR_NAME;
@@ -441,6 +478,8 @@ public class JUnitConfiguration extends ModuleBasedConfiguration<JavaRunConfigur
public String PARAMETERS;
public String WORKING_DIRECTORY;
private String FORK_MODE = "none";
private int REPEAT_COUNT = 1;
private String REPEAT_MODE = RepeatCount.ONCE;
private LinkedHashSet<String> myPattern = new LinkedHashSet<String>();
//iws/ipr compatibility
@@ -463,7 +502,9 @@ public class JUnitConfiguration extends ModuleBasedConfiguration<JavaRunConfigur
Comparing.equal(myPattern, second.myPattern) &&
Comparing.equal(FORK_MODE, second.FORK_MODE) &&
Comparing.equal(DIR_NAME, second.DIR_NAME) &&
Comparing.equal(CATEGORY_NAME, second.CATEGORY_NAME);
Comparing.equal(CATEGORY_NAME, second.CATEGORY_NAME) &&
Comparing.equal(REPEAT_MODE, second.REPEAT_MODE) &&
REPEAT_COUNT == second.REPEAT_COUNT;
}
public int hashCode() {
@@ -477,7 +518,9 @@ public class JUnitConfiguration extends ModuleBasedConfiguration<JavaRunConfigur
Comparing.hashcode(myPattern) ^
Comparing.hashcode(FORK_MODE) ^
Comparing.hashcode(DIR_NAME) ^
Comparing.hashcode(CATEGORY_NAME);
Comparing.hashcode(CATEGORY_NAME) ^
Comparing.hashcode(REPEAT_MODE) ^
Comparing.hashcode(REPEAT_COUNT);
}
public TestSearchScope getScope() {
@@ -71,6 +71,7 @@ import com.intellij.refactoring.listeners.RefactoringElementListener;
import com.intellij.rt.execution.CommandLineWrapper;
import com.intellij.rt.execution.junit.IDEAJUnitListener;
import com.intellij.rt.execution.junit.JUnitStarter;
import com.intellij.rt.execution.junit.RepeatCount;
import com.intellij.util.Function;
import com.intellij.util.PathUtil;
import com.intellij.util.ui.UIUtil;
@@ -423,6 +424,14 @@ public abstract class TestObject implements JavaCommandLine {
protected JUnitProcessHandler createHandler(Executor executor) throws ExecutionException {
appendForkInfo(executor);
final String repeatMode = myConfiguration.getRepeatMode();
if (!RepeatCount.ONCE.equals(repeatMode)) {
final int repeatCount = myConfiguration.getRepeatCount();
final String countString = RepeatCount.N.equals(repeatMode) && repeatCount > 0
? RepeatCount.getCountString(repeatCount)
: repeatMode;
myJavaParameters.getProgramParametersList().add(countString);
}
return JUnitProcessHandler.runCommandLine(CommandLineBuilder.createFromJavaParameters(myJavaParameters, myEnvironment.getProject(), true));
}
@@ -88,7 +88,7 @@
</vspacer>
</children>
</grid>
<grid id="ca987" layout-manager="GridLayoutManager" row-count="1" column-count="3" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<grid id="ca987" layout-manager="GridLayoutManager" row-count="1" column-count="6" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<grid row="0" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="1" fill="1" indent="0" use-parent-layout="false"/>
@@ -96,6 +96,20 @@
<properties/>
<border type="none"/>
<children>
<hspacer id="82483">
<constraints>
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="1" hsize-policy="6" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
</hspacer>
<component id="66e5c" class="javax.swing.JLabel">
<constraints>
<grid row="0" column="3" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<labelFor value="6c375"/>
<text value="&amp;Repeat:"/>
</properties>
</component>
<component id="bafba" class="com.intellij.ui.components.JBLabel">
<constraints>
<grid row="0" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="0" fill="0" indent="0" use-parent-layout="false"/>
@@ -110,11 +124,21 @@
</constraints>
<properties/>
</component>
<hspacer id="82483">
<component id="b1a46" class="javax.swing.JTextField" binding="myRepeatCountField">
<constraints>
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="1" hsize-policy="6" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
<grid row="0" column="5" row-span="1" col-span="1" vsize-policy="0" hsize-policy="2" anchor="8" fill="1" indent="0" use-parent-layout="false">
<preferred-size width="30" height="-1"/>
<maximum-size width="30" height="-1"/>
</grid>
</constraints>
</hspacer>
<properties/>
</component>
<component id="6c375" class="javax.swing.JComboBox" binding="myRepeatCb">
<constraints>
<grid row="0" column="4" row-span="1" col-span="1" vsize-policy="0" hsize-policy="2" anchor="8" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
</component>
</children>
</grid>
<component id="5e32d" class="javax.swing.JSeparator">
@@ -47,6 +47,7 @@ import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.rt.execution.junit.RepeatCount;
import com.intellij.ui.*;
import com.intellij.ui.components.JBLabel;
import com.intellij.util.IconUtil;
@@ -104,6 +105,8 @@ public class JUnitConfigurable extends SettingsEditor<JUnitConfiguration> implem
private JComboBox myTypeChooser;
private JBLabel mySearchForTestsLabel;
private JPanel myScopesPanel;
private JComboBox myRepeatCb;
private JTextField myRepeatCountField;
private static final String[] FORK_MODE_ALL = {JUnitConfiguration.FORK_NONE, JUnitConfiguration.FORK_METHOD, JUnitConfiguration.FORK_KLASS};
private static final String[] FORK_MODE = {JUnitConfiguration.FORK_NONE, JUnitConfiguration.FORK_METHOD};
private Project myProject;
@@ -179,6 +182,15 @@ public class JUnitConfigurable extends SettingsEditor<JUnitConfiguration> implem
myTestLocations[JUnitConfigurationModel.DIR] = myDir;
myTestLocations[JUnitConfigurationModel.CATEGORY] = myCategory;
myRepeatCb.setModel(new DefaultComboBoxModel(RepeatCount.REPEAT_TYPES));
myRepeatCb.setSelectedItem(RepeatCount.ONCE);
myRepeatCb.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
myRepeatCountField.setEnabled(RepeatCount.N.equals(myRepeatCb.getSelectedItem()));
}
});
final JPanel panel = myPattern.getComponent();
panel.setLayout(new BorderLayout());
myPatternTextField = new TextFieldWithBrowseButton();
@@ -246,6 +258,13 @@ public class JUnitConfigurable extends SettingsEditor<JUnitConfiguration> implem
myCommonJavaParameters.applyTo(configuration);
configuration.setForkMode((String)myForkCb.getSelectedItem());
configuration.setRepeatMode((String)myRepeatCb.getSelectedItem());
try {
configuration.setRepeatCount(Integer.parseInt(myRepeatCountField.getText()));
}
catch (NumberFormatException e) {
configuration.setRepeatCount(1);
}
}
public void resetEditorFrom(final JUnitConfiguration configuration) {
@@ -264,6 +283,10 @@ public class JUnitConfigurable extends SettingsEditor<JUnitConfiguration> implem
}
myAlternativeJREPanel.init(configuration.getAlternativeJrePath(), configuration.isAlternativeJrePathEnabled());
myForkCb.setSelectedItem(configuration.getForkMode());
final int count = configuration.getRepeatCount();
myRepeatCountField.setText(String.valueOf(count));
myRepeatCountField.setEnabled(count > 1);
myRepeatCb.setSelectedItem(configuration.getRepeatMode());
}
private void changePanel () {
@@ -37,7 +37,7 @@ public class JUnit3IdeaTestRunner extends TestRunner implements IdeaTestRunner {
super(DeafStream.DEAF_PRINT_STREAM);
}
public int startRunnerWithArgs(String[] args, ArrayList listeners, String name, boolean sendTree) {
public int startRunnerWithArgs(String[] args, ArrayList listeners, String name, int count, boolean sendTree) {
myListeners = listeners;
mySendTree = sendTree;
if (sendTree) {
@@ -34,7 +34,7 @@ public class JUnit4IdeaTestRunner implements IdeaTestRunner {
private RunListener myTestsListener;
private OutputObjectRegistry myRegistry;
public int startRunnerWithArgs(String[] args, ArrayList listeners, String name, boolean sendTree) {
public int startRunnerWithArgs(String[] args, ArrayList listeners, String name, int count, boolean sendTree) {
final Request request = JUnit4TestRunnerUtil.buildRequest(args, name, sendTree);
if (request == null) return -1;
@@ -75,11 +75,38 @@ public class JUnit4IdeaTestRunner implements IdeaTestRunner {
});
}
long startTime = System.currentTimeMillis();
Result result = runner.run(testRunner/*.sortWith(new Comparator() {
public int compare(Object d1, Object d2) {
return ((Description)d1).getDisplayName().compareTo(((Description)d2).getDisplayName());
Result result;
if (count == 1) {
result = runner.run(testRunner);
}
else {
if (count > 0) {
boolean success = true;
int i = 0;
while (i++ < count) {
result = runner.run(testRunner);
success &= result.wasSuccessful();
}
long endTime = System.currentTimeMillis();
long runTime = endTime - startTime;
if (sendTree) new TimeSender(myRegistry).printHeader(runTime);
return success ? 0 : -1;
}
})*/);
else {
boolean success = true;
while (true) {
result = runner.run(testRunner);
success &= result.wasSuccessful();
if (count == -2 && !success) {
long endTime = System.currentTimeMillis();
long runTime = endTime - startTime;
if (sendTree) new TimeSender(myRegistry).printHeader(runTime);
return -1;
}
}
}
}
long endTime = System.currentTimeMillis();
long runTime = endTime - startTime;
if (sendTree) new TimeSender(myRegistry).printHeader(runTime);
@@ -28,7 +28,7 @@ import java.util.List;
public interface IdeaTestRunner {
int startRunnerWithArgs(String[] args, ArrayList listeners, String name, boolean sendTree);
int startRunnerWithArgs(String[] args, ArrayList listeners, String name, int count, boolean sendTree);
void setStreams(SegmentedOutputStream segmentedOut, SegmentedOutputStream segmentedErr, int lastIdx);
Object getTestToStart(String[] args, String name);
@@ -58,7 +58,7 @@ public class JUnitForkedStarter {
IdeaTestRunner testRunner = (IdeaTestRunner)JUnitStarter.getAgentClass(isJUnit4).newInstance();
//noinspection IOResourceOpenedButNotSafelyClosed
testRunner.setStreams(new SegmentedOutputStream(out, true), new SegmentedOutputStream(err, true), lastIdx);
System.exit(testRunner.startRunnerWithArgs(childTestDescription, listeners, null, false));
System.exit(testRunner.startRunnerWithArgs(childTestDescription, listeners, null, 1, false));
}
finally {
System.setOut(oldOut);
@@ -18,7 +18,6 @@ package com.intellij.rt.execution.junit;
import com.intellij.rt.execution.junit.segments.SegmentedOutputStream;
import java.io.*;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.Socket;
import java.util.ArrayList;
@@ -38,6 +37,7 @@ public class JUnitStarter {
private static String ourForkMode;
private static String ourCommandFileName;
private static String ourWorkingDirs;
private static int ourCount = 1;
public static boolean SM_RUNNER = System.getProperty("idea.junit.sm_runner") != null;
public static void main(String[] args) throws IOException {
@@ -124,6 +124,13 @@ public class JUnitStarter {
continue;
}
final int count = RepeatCount.getCount(arg);
if (count != 0) {
ourCount = count;
continue;
}
result.addElement(arg);
}
}
@@ -209,7 +216,7 @@ public class JUnitStarter {
}
IdeaTestRunner testRunner = (IdeaTestRunner)getAgentClass(isJUnit4).newInstance();
testRunner.setStreams(out, err, 0);
return testRunner.startRunnerWithArgs(args, listeners, name, !SM_RUNNER);
return testRunner.startRunnerWithArgs(args, listeners, name, ourCount, !SM_RUNNER);
}
catch (Exception e) {
e.printStackTrace(System.err);
@@ -0,0 +1,60 @@
/*
* Copyright 2000-2015 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.rt.execution.junit;
public abstract class RepeatCount {
public static final String ONCE = "Once";
public static final String N = "N Times";
public static final String UNTIL_FAILURE = "Until Failure";
public static final String UNLIMITED = "Until Stopped";
public static final String[] REPEAT_TYPES = new String[]{ONCE, N, UNTIL_FAILURE, UNLIMITED};
public static String getCountString(int count) {
if (count > 1) {
return "@" + N + count;
}
if (count == -1) {
return UNLIMITED;
}
if (count == -2) {
return UNTIL_FAILURE;
}
return ONCE;
}
public static int getCount(String countString) {
if (countString.equals(ONCE)) {
return 1;
}
if (countString.equals(UNLIMITED)) {
return -1;
}
if (countString.equals(UNTIL_FAILURE)) {
return -2;
}
if (countString.startsWith("@" + N)) {
try {
return Integer.parseInt(countString.substring(2));
}
catch (NumberFormatException ignore) {}
}
return 0;
}
}
+1
View File
@@ -1156,6 +1156,7 @@
<extendWordSelectionHandler implementation="com.intellij.codeInsight.editorActions.wordSelection.StatementGroupSelectioner"/>
<extendWordSelectionHandler implementation="com.intellij.codeInsight.editorActions.wordSelection.CaseStatementsSelectioner"/>
<extendWordSelectionHandler implementation="com.intellij.codeInsight.editorActions.wordSelection.AntLikePropertySelectionHandler"/>
<extendWordSelectionHandler implementation="com.intellij.codeInsight.editorActions.wordSelection.MethodCallSelectioner"/>
<structureViewBuilder key="CLASS" factoryClass="com.intellij.ide.highlighter.JavaClsStructureViewBuilderProvider"/>
@@ -29,11 +29,13 @@ import com.intellij.psi.PsiFile;
import com.intellij.psi.codeStyle.CodeStyleManager;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.xml.*;
import com.intellij.util.ArrayUtil;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.HashSet;
/**
* @author Dmitry Avdeev
*/
@@ -110,8 +112,8 @@ public class DefaultXmlSuppressionProvider extends XmlSuppressionProvider implem
if (id == null) {
return true;
}
@NonNls final String[] parts = text.split("[ ,]");
return ArrayUtil.find(parts, id) != -1 || ArrayUtil.find(parts, XmlSuppressableInspectionTool.ALL) != -1;
@NonNls final HashSet<String> parts = ContainerUtil.newHashSet(StringUtil.getWordsIn(text));
return parts.contains(id) || parts.contains(XmlSuppressableInspectionTool.ALL);
}
protected void suppress(PsiFile file, final PsiElement suppressionElement, String inspectionId, final int offset) {