Skip to content

Commit

Permalink
Merge with master
Browse files Browse the repository at this point in the history
  • Loading branch information
dmalch committed Mar 27, 2014
1 parent 4e5342c commit 39e0684
Show file tree
Hide file tree
Showing 31 changed files with 472 additions and 400 deletions.
5 changes: 3 additions & 2 deletions META-INF/plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,10 @@
<li>Does not take into account any custom JBehave configuration</li>
</ul>
]]></description>
<version>3</version>
<version>1.2</version>
<vendor url="https://github.com/witspirit" email="witspirit@gmail.com">Bert Van Vlerken</vendor>
<idea-version since-build="8000"/>

<idea-version since-build="133.0"/>

<application-components>
<component>
Expand Down
5 changes: 5 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,11 @@
<artifactId>hamcrest-all</artifactId>
<version>1.3</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>16.0.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,18 +15,23 @@
*/
package com.github.kumaraman21.intellijbehave.codeInspector;

import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;

import com.github.kumaraman21.intellijbehave.highlighter.StorySyntaxHighlighter;
import com.github.kumaraman21.intellijbehave.parser.StepPsiElement;
import com.github.kumaraman21.intellijbehave.resolver.StepDefinitionAnnotation;
import com.github.kumaraman21.intellijbehave.utility.ParametrizedString;
import com.intellij.codeInspection.*;
import com.intellij.codeInspection.BaseJavaLocalInspectionTool;
import com.intellij.codeInspection.LocalQuickFix;
import com.intellij.codeInspection.ProblemDescriptor;
import com.intellij.codeInspection.ProblemHighlightType;
import com.intellij.codeInspection.ProblemsHolder;
import com.intellij.codeInspection.ex.ProblemDescriptorImpl;
import com.intellij.openapi.editor.colors.TextAttributesKey;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiElementVisitor;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;

public class UndefinedStepsInspection extends BaseJavaLocalInspectionTool {

Expand Down Expand Up @@ -62,19 +67,19 @@ public boolean isEnabledByDefault() {

@NotNull
@Override
public PsiElementVisitor buildVisitor(@NotNull final ProblemsHolder holder, final boolean isOnTheFly) {
public PsiElementVisitor buildVisitor(@NotNull final ProblemsHolder holder, boolean isOnTheFly) {
return new PsiElementVisitor() {

@Override
public void visitElement(final PsiElement psiElement) {
public void visitElement(PsiElement psiElement) {
super.visitElement(psiElement);

if (!(psiElement instanceof StepPsiElement)) {
return;
}

final StepPsiElement stepPsiElement = (StepPsiElement) psiElement;
final StepDefinitionAnnotation annotationDef = stepPsiElement.getReference().stepDefinitionAnnotation();
StepPsiElement stepPsiElement = (StepPsiElement) psiElement;
StepDefinitionAnnotation annotationDef = stepPsiElement.getReference().stepDefinitionAnnotation();
if (annotationDef == null) {
holder.registerProblem(stepPsiElement, "Step <code>#ref</code> is not defined");
} else {
Expand All @@ -85,16 +90,16 @@ public void visitElement(final PsiElement psiElement) {
}


private void highlightParameters(final StepPsiElement stepPsiElement,
final StepDefinitionAnnotation annotation,
final ProblemsHolder holder) {
final String stepText = stepPsiElement.getStepText();
final String annotationText = annotation.getAnnotationText();
final ParametrizedString pString = new ParametrizedString(annotationText);
private void highlightParameters(StepPsiElement stepPsiElement,
StepDefinitionAnnotation annotation,
ProblemsHolder holder) {
String stepText = stepPsiElement.getStepText();
String annotationText = annotation.getAnnotationText();
ParametrizedString pString = new ParametrizedString(annotationText);

int offset = stepPsiElement.getStepTextOffset();
for (final ParametrizedString.StringToken token : pString.tokenize(stepText)) {
final int length = token.getValue().length();
for (ParametrizedString.StringToken token : pString.tokenize(stepText)) {
int length = token.getValue().length();
if (token.isIdentifier()) {
registerHiglighting(StorySyntaxHighlighter.TABLE_CELL,
stepPsiElement,
Expand All @@ -105,10 +110,10 @@ private void highlightParameters(final StepPsiElement stepPsiElement,
}
}

private static void registerHiglighting(final TextAttributesKey attributesKey,
final StepPsiElement step,
final TextRange range,
final ProblemsHolder holder) {
private static void registerHiglighting(TextAttributesKey attributesKey,
StepPsiElement step,
TextRange range,
ProblemsHolder holder) {
final ProblemDescriptor descriptor = new ProblemDescriptorImpl(
step, step, "", LocalQuickFix.EMPTY_ARRAY,
ProblemHighlightType.INFORMATION, false, range, false, null,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,11 +79,11 @@ public boolean isEnabledByDefault() {

@NotNull
@Override
public PsiElementVisitor buildVisitor(@NotNull final ProblemsHolder holder, final boolean isOnTheFly) {
public PsiElementVisitor buildVisitor(@NotNull final ProblemsHolder holder, boolean isOnTheFly) {
return new JavaElementVisitor() {

@Override
public void visitElement(final PsiElement element) {
public void visitElement(PsiElement element) {
super.visitElement(element);

if (!(element instanceof PsiAnnotation)) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package com.github.kumaraman21.intellijbehave.completion;

import org.jbehave.core.i18n.LocalizedKeywords;
import org.jbehave.core.steps.StepType;

import com.github.kumaraman21.intellijbehave.highlighter.StoryTokenType;
import com.github.kumaraman21.intellijbehave.parser.StepPsiElement;
import com.github.kumaraman21.intellijbehave.resolver.StepDefinitionAnnotation;
Expand All @@ -8,16 +11,19 @@
import com.github.kumaraman21.intellijbehave.utility.LocalizedStorySupport;
import com.github.kumaraman21.intellijbehave.utility.ParametrizedString;
import com.github.kumaraman21.intellijbehave.utility.ScanUtils;
import com.intellij.codeInsight.completion.*;
import com.intellij.codeInsight.completion.CompletionContributor;
import com.intellij.codeInsight.completion.CompletionParameters;
import com.intellij.codeInsight.completion.CompletionResultSet;
import com.intellij.codeInsight.completion.CompletionType;
import com.intellij.codeInsight.completion.CompletionUtil;
import com.intellij.codeInsight.completion.PrefixMatcher;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.codeInsight.lookup.LookupElementBuilder;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiAnnotation;
import com.intellij.psi.PsiElement;
import com.intellij.util.Consumer;
import org.jbehave.core.i18n.LocalizedKeywords;
import org.jbehave.core.steps.StepType;

/**
* @author <a href="http://twitter.com/aloyer">@aloyer</a>
Expand All @@ -27,13 +33,13 @@ public StoryCompletionContributor() {
}

@Override
public void fillCompletionVariants(final CompletionParameters parameters, final CompletionResultSet _result) {
public void fillCompletionVariants(CompletionParameters parameters, final CompletionResultSet _result) {
if (parameters.getCompletionType() == CompletionType.BASIC) {
final String prefix = CompletionUtil.findReferenceOrAlphanumericPrefix(parameters);
final CompletionResultSet result = _result.withPrefixMatcher(prefix);
String prefix = CompletionUtil.findReferenceOrAlphanumericPrefix(parameters);
CompletionResultSet result = _result.withPrefixMatcher(prefix);

final LocalizedKeywords keywords = lookupLocalizedKeywords(parameters);
final Consumer<LookupElement> consumer = newConsumer(_result);
LocalizedKeywords keywords = lookupLocalizedKeywords(parameters);
Consumer<LookupElement> consumer = newConsumer(_result);

addAllKeywords(result.getPrefixMatcher(), consumer, keywords);
addAllSteps(parameters,
Expand All @@ -43,11 +49,11 @@ public void fillCompletionVariants(final CompletionParameters parameters, final
}
}

private LocalizedKeywords lookupLocalizedKeywords(final CompletionParameters parameters) {
private LocalizedKeywords lookupLocalizedKeywords(CompletionParameters parameters) {
String locale = "en";
final ASTNode localeNode = parameters.getOriginalFile().getNode().findChildByType(StoryTokenType.COMMENT_WITH_LOCALE);
ASTNode localeNode = parameters.getOriginalFile().getNode().findChildByType(StoryTokenType.COMMENT_WITH_LOCALE);
if (localeNode != null) {
final String localeFound = LocalizedStorySupport.checkForLanguageDefinition(localeNode.getText());
String localeFound = LocalizedStorySupport.checkForLanguageDefinition(localeNode.getText());
if (localeFound != null) {
locale = localeFound;
}
Expand All @@ -58,15 +64,15 @@ private LocalizedKeywords lookupLocalizedKeywords(final CompletionParameters par
private static Consumer<LookupElement> newConsumer(final CompletionResultSet result) {
return new Consumer<LookupElement>() {
@Override
public void consume(final LookupElement element) {
public void consume(LookupElement element) {
result.addElement(element);
}
};
}

private static void addAllKeywords(final PrefixMatcher prefixMatcher,
final Consumer<LookupElement> consumer,
final LocalizedKeywords keywords) {
private static void addAllKeywords(PrefixMatcher prefixMatcher,
Consumer<LookupElement> consumer,
LocalizedKeywords keywords) {
addIfMatches(consumer, prefixMatcher, keywords.narrative());
addIfMatches(consumer, prefixMatcher, keywords.asA());
addIfMatches(consumer, prefixMatcher, keywords.inOrderTo());
Expand All @@ -83,28 +89,29 @@ private static void addAllKeywords(final PrefixMatcher prefixMatcher,
addIfMatches(consumer, prefixMatcher, keywords.and());
}

private static void addIfMatches(final Consumer<LookupElement> consumer, final PrefixMatcher prefixMatchers, final String input) {
private static void addIfMatches(Consumer<LookupElement> consumer, PrefixMatcher prefixMatchers, String input) {
if (prefixMatchers.prefixMatches(input)) {
consumer.consume(LookupElementBuilder.create(input));
}
}

private static void addAllSteps(final CompletionParameters parameters,
final PrefixMatcher prefixMatcher,
final Consumer<LookupElement> consumer, final LocalizedKeywords keywords) {
final StepPsiElement stepPsiElement = getStepPsiElement(parameters);
private static void addAllSteps(CompletionParameters parameters,
PrefixMatcher prefixMatcher,
Consumer<LookupElement> consumer,
LocalizedKeywords keywords) {
StepPsiElement stepPsiElement = getStepPsiElement(parameters);
if (stepPsiElement == null) {
return;
}

final StepType stepType = stepPsiElement.getStepType();
final String actualStepPrefix = stepPsiElement.getActualStepPrefix();
StepType stepType = stepPsiElement.getStepType();
String actualStepPrefix = stepPsiElement.getActualStepPrefix();
//
final String textBeforeCaret = CompletionUtil.findReferenceOrAlphanumericPrefix(parameters);
String textBeforeCaret = CompletionUtil.findReferenceOrAlphanumericPrefix(parameters);

// suggest only if at least the actualStepPrefix is complete
if (isStepTypeComplete(keywords, textBeforeCaret)) {
final StepSuggester stepAnnotationFinder = new StepSuggester(prefixMatcher,
StepSuggester stepAnnotationFinder = new StepSuggester(prefixMatcher,
stepType,
actualStepPrefix,
textBeforeCaret,
Expand All @@ -114,16 +121,16 @@ private static void addAllSteps(final CompletionParameters parameters,
}
}

private static boolean isStepTypeComplete(final LocalizedKeywords keywords, final String input) {
private static boolean isStepTypeComplete(LocalizedKeywords keywords, String input) {
return input.startsWith(keywords.given())
|| input.startsWith(keywords.when())
|| input.startsWith(keywords.then())
|| input.startsWith(keywords.and());
}

private static StepPsiElement getStepPsiElement(final CompletionParameters parameters) {
final PsiElement position = parameters.getPosition();
final PsiElement positionParent = position.getParent();
private static StepPsiElement getStepPsiElement(CompletionParameters parameters) {
PsiElement position = parameters.getPosition();
PsiElement positionParent = position.getParent();
if (positionParent instanceof StepPsiElement) {
return (StepPsiElement) positionParent;
} else if (position instanceof StepPsiReference) {
Expand All @@ -143,11 +150,12 @@ private static class StepSuggester extends StepDefinitionIterator {
private final String textBeforeCaret;
private final Consumer<LookupElement> consumer;

private StepSuggester(final PrefixMatcher prefixMatcher,
final StepType stepType,
final String actualStepPrefix,
final String textBeforeCaret, final Consumer<LookupElement> consumer,
final StepPsiElement storyRef) {
private StepSuggester(PrefixMatcher prefixMatcher,
StepType stepType,
String actualStepPrefix,
String textBeforeCaret,
Consumer<LookupElement> consumer,
StepPsiElement storyRef) {
super(null, storyRef);
this.prefixMatcher = prefixMatcher;
this.stepType = stepType;
Expand All @@ -157,21 +165,21 @@ private StepSuggester(final PrefixMatcher prefixMatcher,
}

@Override
public boolean processStepDefinition(final StepDefinitionAnnotation stepDefinitionAnnotation) {
final StepType annotationStepType = stepDefinitionAnnotation.getStepType();
public boolean processStepDefinition(StepDefinitionAnnotation stepDefinitionAnnotation) {
StepType annotationStepType = stepDefinitionAnnotation.getStepType();
if (annotationStepType != stepType) {
return true;
}
final String annotationText = stepDefinitionAnnotation.getAnnotationText();
final String adjustedAnnotationText = actualStepPrefix + " " + annotationText;
String annotationText = stepDefinitionAnnotation.getAnnotationText();
String adjustedAnnotationText = actualStepPrefix + " " + annotationText;

final ParametrizedString pString = new ParametrizedString(adjustedAnnotationText);
final String complete = pString.complete(textBeforeCaret);
ParametrizedString pString = new ParametrizedString(adjustedAnnotationText);
String complete = pString.complete(textBeforeCaret);
if (StringUtil.isNotEmpty(complete)) {
final PsiAnnotation matchingAnnotation = stepDefinitionAnnotation.getAnnotation();
PsiAnnotation matchingAnnotation = stepDefinitionAnnotation.getAnnotation();
consumer.consume(LookupElementBuilder.create(matchingAnnotation, textBeforeCaret + complete));
} else if (prefixMatcher.prefixMatches(adjustedAnnotationText)) {
final PsiAnnotation matchingAnnotation = stepDefinitionAnnotation.getAnnotation();
PsiAnnotation matchingAnnotation = stepDefinitionAnnotation.getAnnotation();
consumer.consume(LookupElementBuilder.create(matchingAnnotation, adjustedAnnotationText));
}
return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,12 @@ public enum LexicalState {

private final int lexerId;

LexicalState(final int lexerId) {
LexicalState(int lexerId) {
this.lexerId = lexerId;
}

public static LexicalState fromLexer(final int lexerId) {
for (final LexicalState state : values()) {
public static LexicalState fromLexer(int lexerId) {
for (LexicalState state : values()) {
if (state.lexerId == lexerId) {
return state;
}
Expand Down
Loading

0 comments on commit 39e0684

Please sign in to comment.