Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 44eba02

Browse files
committed
Adapted fr.adrienbrault.idea.symfony2plugin.security.AnnotationExpressionGotoCompletionRegistrar
1 parent 2c10c84 commit 44eba02

File tree

1 file changed

+28
-73
lines changed

1 file changed

+28
-73
lines changed
Lines changed: 28 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,45 @@
11
package fr.adrienbrault.idea.symfony2plugin.security;
22

33
import com.intellij.codeInsight.completion.CompletionResultSet;
4-
import com.intellij.patterns.PatternCondition;
4+
import com.intellij.openapi.util.text.StringUtil;
55
import com.intellij.patterns.PlatformPatterns;
6+
import com.intellij.patterns.StandardPatterns;
67
import com.intellij.psi.PsiElement;
7-
import com.intellij.util.ProcessingContext;
8-
import com.jetbrains.php.lang.documentation.phpdoc.lexer.PhpDocTokenTypes;
9-
import com.jetbrains.php.lang.documentation.phpdoc.parser.PhpDocElementTypes;
10-
import com.jetbrains.php.lang.documentation.phpdoc.psi.tags.PhpDocTag;
11-
import com.jetbrains.php.lang.psi.elements.StringLiteralExpression;
12-
import de.espend.idea.php.annotation.util.AnnotationUtil;
138
import fr.adrienbrault.idea.symfony2plugin.codeInsight.GotoCompletionProvider;
149
import fr.adrienbrault.idea.symfony2plugin.codeInsight.GotoCompletionProviderLookupArguments;
1510
import fr.adrienbrault.idea.symfony2plugin.codeInsight.GotoCompletionRegistrar;
1611
import fr.adrienbrault.idea.symfony2plugin.codeInsight.GotoCompletionRegistrarParameter;
12+
import fr.adrienbrault.idea.symfony2plugin.expressionLanguage.psi.*;
1713
import fr.adrienbrault.idea.symfony2plugin.security.utils.VoterUtil;
18-
import fr.adrienbrault.idea.symfony2plugin.util.PhpElementsUtil;
1914
import org.jetbrains.annotations.NotNull;
2015

2116
import java.util.Collection;
2217
import java.util.Collections;
2318
import java.util.HashSet;
24-
import java.util.regex.Matcher;
25-
import java.util.regex.Pattern;
2619

2720
/**
2821
* @author Daniel Espendiller <daniel@espendiller.net>
2922
*/
3023
public class AnnotationExpressionGotoCompletionRegistrar implements GotoCompletionRegistrar {
3124

32-
private static final String SECURITY_ANNOTATION = "Sensio\\Bundle\\FrameworkExtraBundle\\Configuration\\Security";
33-
3425
@Override
3526
public void register(@NotNull GotoCompletionRegistrarParameter registrar) {
3627
// "@Security("is_granted('POST_SHOW', post) and has_role('ROLE_ADMIN')")"
3728
registrar.register(
38-
PlatformPatterns.psiElement(PhpDocTokenTypes.DOC_STRING)
39-
.withParent(PlatformPatterns.psiElement(StringLiteralExpression.class)
40-
.withParent(PlatformPatterns.psiElement(PhpDocElementTypes.phpDocAttributeList)
41-
.withParent(PlatformPatterns.psiElement(PhpDocTag.class)
42-
.with(PhpDocInstancePatternCondition.INSTANCE)
29+
PlatformPatterns.psiElement()
30+
.withParent(PlatformPatterns
31+
.psiElement(ExpressionLanguageStringLiteral.class)
32+
.withParent(PlatformPatterns
33+
.psiElement(ExpressionLanguageLiteralExpr.class)
34+
.withParent(PlatformPatterns
35+
.psiElement(ExpressionLanguageCallExpr.class)
36+
.withFirstChild(PlatformPatterns
37+
.psiElement(ExpressionLanguageRefExpr.class)
38+
.withText(StandardPatterns.string().oneOf("has_role", "is_granted"))
39+
)
40+
)
4341
)
44-
)
45-
),
42+
),
4643
MyGotoCompletionProvider::new
4744
);
4845
}
@@ -59,75 +56,33 @@ private static class MyGotoCompletionProvider extends GotoCompletionProvider {
5956
@Override
6057
public void getLookupElements(@NotNull GotoCompletionProviderLookupArguments arguments) {
6158
final CompletionResultSet resultSet = arguments.getResultSet();
62-
String blockNamePrefix = resultSet.getPrefixMatcher().getPrefix();
63-
64-
// find caret position:
65-
// - "has_role('"
66-
// - "has_role('YAML_ROLE_"
67-
if(!blockNamePrefix.matches("^.*(has_role|is_granted)\\s*\\(\\s*'[\\w-]*$")) {
68-
return;
69-
}
70-
71-
// clear prefix caret string; for a clean completion independent from inside content
72-
CompletionResultSet myResultSet = resultSet.withPrefixMatcher("");
7359

7460
VoterUtil.LookupElementPairConsumer consumer = new VoterUtil.LookupElementPairConsumer();
7561
VoterUtil.visitAttribute(getProject(), consumer);
76-
myResultSet.addAllElements(consumer.getLookupElements());
62+
resultSet.addAllElements(consumer.getLookupElements());
7763
}
7864

7965
@NotNull
8066
@Override
8167
public Collection<PsiElement> getPsiTargets(PsiElement element) {
82-
if(getElement().getNode().getElementType() != PhpDocTokenTypes.DOC_STRING) {
83-
return Collections.emptyList();
84-
}
85-
86-
PsiElement parent = getElement().getParent();
87-
if(!(parent instanceof StringLiteralExpression)) {
68+
if(getElement().getNode().getElementType() != ExpressionLanguageTypes.STRING) {
8869
return Collections.emptyList();
8970
}
9071

91-
String contents = ((StringLiteralExpression) parent).getContents();
72+
var role = element.getText();
73+
if (!StringUtil.isEmpty(role)) {
74+
var targets = new HashSet<PsiElement>();
9275

93-
Collection<String> roles = new HashSet<>();
94-
for (String regex : new String[]{"is_granted\\s*\\(\\s*['|\"]([^'\"]+)['|\"]\\s*[\\)|,]", "has_role\\s*\\(\\s*['|\"]([^'\"]+)['|\"]\\s*\\)"}) {
95-
Matcher matcher = Pattern.compile(regex).matcher(contents);
96-
while(matcher.find()){
97-
roles.add(matcher.group(1));
98-
}
99-
}
76+
VoterUtil.visitAttribute(getProject(), pair -> {
77+
if(pair.getFirst().equals(role.substring(1, role.length() - 1))) {
78+
targets.add(pair.getSecond());
79+
}
80+
});
10081

101-
if(roles.size() == 0) {
102-
return Collections.emptyList();
82+
return targets;
10383
}
10484

105-
Collection<PsiElement> targets = new HashSet<>();
106-
107-
VoterUtil.visitAttribute(getProject(), pair -> {
108-
if(roles.contains(pair.getFirst())) {
109-
targets.add(pair.getSecond());
110-
}
111-
});
112-
113-
return targets;
114-
}
115-
}
116-
117-
/**
118-
* Check if given PhpDocTag is instance of given Annotation class
119-
*/
120-
private static class PhpDocInstancePatternCondition extends PatternCondition<PsiElement> {
121-
private static PhpDocInstancePatternCondition INSTANCE = new PhpDocInstancePatternCondition();
122-
123-
PhpDocInstancePatternCondition() {
124-
super("PhpDoc Annotation Instance");
125-
}
126-
127-
@Override
128-
public boolean accepts(@NotNull PsiElement psiElement, ProcessingContext processingContext) {
129-
return psiElement instanceof PhpDocTag
130-
&& PhpElementsUtil.isEqualClassName(AnnotationUtil.getAnnotationReference((PhpDocTag) psiElement), SECURITY_ANNOTATION);
85+
return Collections.emptyList();
13186
}
13287
}
13388
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /