Skip to content

Commit

Permalink
migrate MethodSignatureTypeProvider to PhpTypeProvider3; prevent cros…
Browse files Browse the repository at this point in the history
…s plugin issue #926 #792
  • Loading branch information
Haehnchen committed May 7, 2017
1 parent 62c6e60 commit 623fc52
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 51 deletions.
3 changes: 2 additions & 1 deletion META-INF/plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -298,6 +298,7 @@
<typeProvider3 implementation="fr.adrienbrault.idea.symfony2plugin.doctrine.ObjectRepositoryTypeProvider"/>
<typeProvider3 implementation="fr.adrienbrault.idea.symfony2plugin.doctrine.ObjectRepositoryResultTypeProvider"/>
<typeProvider3 implementation="fr.adrienbrault.idea.symfony2plugin.doctrine.ObjectManagerFindTypeProvider"/>
<typeProvider3 implementation="fr.adrienbrault.idea.symfony2plugin.assistant.signature.MethodSignatureTypeProvider"/>
</extensions>

<extensions defaultExtensionNs="com.intellij">
Expand Down Expand Up @@ -356,7 +357,7 @@
<iconProvider implementation="fr.adrienbrault.idea.symfony2plugin.templating.TwigFileIconProvider" />
-->

<php.typeProvider2 implementation="fr.adrienbrault.idea.symfony2plugin.assistant.signature.MethodSignatureTypeProvider"/>


<psi.referenceContributor implementation="fr.adrienbrault.idea.symfony2plugin.config.SymfonyPhpReferenceContributor"/>
<psi.referenceContributor implementation="fr.adrienbrault.idea.symfony2plugin.translation.TranslationReferenceContributor"/>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,29 +1,30 @@
package fr.adrienbrault.idea.symfony2plugin.assistant.signature;

import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.project.DumbService;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiElement;
import com.jetbrains.php.PhpIndex;
import com.jetbrains.php.lang.psi.elements.*;
import com.jetbrains.php.lang.psi.resolve.types.PhpTypeProvider2;
import com.jetbrains.php.lang.psi.resolve.types.PhpType;
import com.jetbrains.php.lang.psi.resolve.types.PhpTypeProvider3;
import fr.adrienbrault.idea.symfony2plugin.Settings;
import fr.adrienbrault.idea.symfony2plugin.Symfony2InterfacesUtil;
import fr.adrienbrault.idea.symfony2plugin.extension.MethodSignatureTypeProviderExtension;
import fr.adrienbrault.idea.symfony2plugin.extension.MethodSignatureTypeProviderParameter;
import fr.adrienbrault.idea.symfony2plugin.util.PhpTypeProviderUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;

/**
* @author Adrien Brault <adrien.brault@gmail.com>
* @author Daniel Espendiller <daniel@espendiller.net>
*/
public class MethodSignatureTypeProvider implements PhpTypeProvider2 {
public class MethodSignatureTypeProvider implements PhpTypeProvider3 {

final static char TRIM_KEY = '\u0181';
private static final ExtensionPointName<MethodSignatureTypeProviderExtension> EXTENSIONS = new ExtensionPointName<>("fr.adrienbrault.idea.symfony2plugin.extension.MethodSignatureTypeProviderExtension");
Expand All @@ -35,38 +36,18 @@ public char getKey() {

@Nullable
@Override
public String getType(PsiElement e) {

if (DumbService.getInstance(e.getProject()).isDumb() || !Settings.getInstance(e.getProject()).pluginEnabled || !(e instanceof MethodReference)) {
public PhpType getType(PsiElement e) {
if (!Settings.getInstance(e.getProject()).pluginEnabled || !(e instanceof MethodReference)) {
return null;
}

List<MethodSignatureSetting> signatures = new ArrayList<>();

// get user defined settings
if(Settings.getInstance(e.getProject()).objectSignatureTypeProvider) {
List<MethodSignatureSetting> settingSignatures = Settings.getInstance(e.getProject()).methodSignatureSettings;
if(settingSignatures != null) {
signatures.addAll(settingSignatures);
}
}

// load extension
MethodSignatureTypeProviderExtension[] extensions = EXTENSIONS.getExtensions();
if(extensions.length > 0) {
MethodSignatureTypeProviderParameter parameter = new MethodSignatureTypeProviderParameter(e);
for(MethodSignatureTypeProviderExtension extension: extensions){
signatures.addAll(extension.getSignatures(parameter));
}
}

// we not have custom settings
Collection<MethodSignatureSetting> signatures = getSignatureSettings(e);
if(signatures.size() == 0) {
return null;
}

MethodReference methodReference = (MethodReference) e;
ArrayList<MethodSignatureSetting> matchedSignatures = getSignatureSetting(methodReference.getName(), signatures);
Collection<MethodSignatureSetting> matchedSignatures = getSignatureSetting(methodReference.getName(), signatures);
if(matchedSignatures.size() == 0) {
return null;
}
Expand All @@ -85,27 +66,47 @@ public String getType(PsiElement e) {
if ((parameter instanceof StringLiteralExpression)) {
String param = ((StringLiteralExpression)parameter).getContents();
if (StringUtil.isNotEmpty(param)) {
return refSignature + TRIM_KEY + param;
return new PhpType().add("#" + this.getKey() + refSignature + TRIM_KEY + param);
}
}

// @TODO: use PhpTypeProviderUtil
if (parameter instanceof PhpReference && (parameter instanceof ClassConstantReference || parameter instanceof FieldReference)) {
String signature = ((PhpReference) parameter).getSignature();
if (StringUtil.isNotEmpty(signature)) {
return refSignature + TRIM_KEY + signature;
}
String parameterSignature = PhpTypeProviderUtil.getReferenceSignatureByFirstParameter(methodReference, TRIM_KEY);
if(parameterSignature != null) {
return new PhpType().add("#" + this.getKey() + parameterSignature);
}

}
}

return null;
}

private ArrayList<MethodSignatureSetting> getSignatureSetting(String methodName, List<MethodSignatureSetting> methodSignatureSettingList) {
@NotNull
private Collection<MethodSignatureSetting> getSignatureSettings(@NotNull PsiElement psiElement) {
Collection<MethodSignatureSetting> signatures = new ArrayList<>();

// get user defined settings
if(Settings.getInstance(psiElement.getProject()).objectSignatureTypeProvider) {
Collection<MethodSignatureSetting> settingSignatures = Settings.getInstance(psiElement.getProject()).methodSignatureSettings;
if(settingSignatures != null) {
signatures.addAll(settingSignatures);
}
}

// load extension
MethodSignatureTypeProviderExtension[] extensions = EXTENSIONS.getExtensions();
if(extensions.length > 0) {
MethodSignatureTypeProviderParameter parameter = new MethodSignatureTypeProviderParameter(psiElement);
for(MethodSignatureTypeProviderExtension extension: extensions){
signatures.addAll(extension.getSignatures(parameter));
}
}

return signatures;
}

private Collection<MethodSignatureSetting> getSignatureSetting(String methodName, Collection<MethodSignatureSetting> methodSignatureSettingList) {

ArrayList<MethodSignatureSetting> matchedSignatures = new ArrayList<>();
Collection<MethodSignatureSetting> matchedSignatures = new ArrayList<>();

for(MethodSignatureSetting methodSignatureSetting: methodSignatureSettingList) {
if(methodSignatureSetting.getMethodName().equals(methodName)) {
Expand All @@ -117,8 +118,7 @@ private ArrayList<MethodSignatureSetting> getSignatureSetting(String methodName,
}

@Override
public Collection<? extends PhpNamedElement> getBySignature(String expression, Project project) {

public Collection<? extends PhpNamedElement> getBySignature(String expression, Set<String> visited, int depth, Project project) {
// get back our original call
int endIndex = expression.lastIndexOf(TRIM_KEY);
if(endIndex == -1) {
Expand All @@ -140,23 +140,20 @@ public Collection<? extends PhpNamedElement> getBySignature(String expression, P
return null;
}

List<MethodSignatureSetting> signatures = Settings.getInstance(project).methodSignatureSettings;
if(signatures == null) {
Collection<MethodSignatureSetting> signatures = getSignatureSettings(phpNamedElement);
if(signatures.size() == 0) {
return null;
}

ArrayList<PhpNamedElement> phpNamedElements = new ArrayList<>();
phpNamedElements.add(phpNamedElement);

PhpTypeSignatureInterface[] signatureTypeProviders = PhpTypeSignatureTypes.DEFAULT_PROVIDER;

parameter = PhpTypeProviderUtil.getResolvedParameter(phpIndex, parameter);
if(parameter == null) {
return phpNamedElementCollections;
return null;
}

Collection<PhpNamedElement> phpNamedElements = new ArrayList<>();

for(MethodSignatureSetting matchedSignature: signatures) {
for(PhpTypeSignatureInterface signatureTypeProvider: signatureTypeProviders) {
for(PhpTypeSignatureInterface signatureTypeProvider: PhpTypeSignatureTypes.DEFAULT_PROVIDER) {
if( signatureTypeProvider.getName().equals(matchedSignature.getReferenceProviderName()) && new Symfony2InterfacesUtil().isCallTo((Method) phpNamedElement, matchedSignature.getCallTo(), matchedSignature.getMethodName())) {
Collection<? extends PhpNamedElement> namedElements = signatureTypeProvider.getByParameter(project, parameter);
if(namedElements != null) {
Expand All @@ -169,5 +166,4 @@ public Collection<? extends PhpNamedElement> getBySignature(String expression, P
// not good but we need return any previous types: null clears all types
return new ArrayList<>(phpNamedElements);
}

}

0 comments on commit 623fc52

Please sign in to comment.