Skip to content

Commit 0b3757b

Browse files
authored
Merge pull request #6712 from junichi11/php-gh-3933-6634-improve-gotodecl
PHP: Improve the performance for Go to Declaration
2 parents e91ac62 + de1f2ed commit 0b3757b

File tree

7 files changed

+91
-24
lines changed

7 files changed

+91
-24
lines changed

php/php.editor/src/org/netbeans/modules/php/editor/CodeUtils.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ public final class CodeUtils {
9393
public static final Pattern WHITE_SPACES_PATTERN = Pattern.compile("\\s+"); // NOI18N
9494
public static final Pattern SPLIT_TYPES_PATTERN = Pattern.compile("[()|&]+"); // NOI18N
9595
public static final Pattern TYPE_NAMES_IN_TYPE_DECLARATION_PATTERN = Pattern.compile("[^?()|&]+"); // NOI18N
96+
public static final Pattern COMMA_PATTERN = Pattern.compile(","); // NOI18N
9697

9798
private static final Logger LOGGER = Logger.getLogger(CodeUtils.class.getName());
9899

php/php.editor/src/org/netbeans/modules/php/editor/elements/ClassElementImpl.java

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.util.Set;
2626
import java.util.StringTokenizer;
2727
import org.netbeans.api.annotations.common.CheckForNull;
28+
import org.netbeans.api.annotations.common.NullAllowed;
2829
import org.netbeans.modules.parsing.spi.indexing.support.IndexResult;
2930
import org.netbeans.modules.php.api.editor.PhpClass;
3031
import org.netbeans.modules.php.editor.CodeUtils;
@@ -47,8 +48,10 @@
4748
* @author Radek Matous
4849
*/
4950
public final class ClassElementImpl extends TypeElementImpl implements ClassElement {
51+
5052
public static final String IDX_FIELD = PHPIndexer.FIELD_CLASS;
5153

54+
@NullAllowed
5255
private final QualifiedName superClass;
5356
private final Collection<QualifiedName> possibleFQSuperClassNames;
5457
private final Collection<QualifiedName> fqMixinClassNames;
@@ -72,6 +75,28 @@ private ClassElementImpl(
7275
this.possibleFQSuperClassNames = possibleFQSuperClassNames;
7376
this.usedTraits = usedTraits;
7477
this.fqMixinClassNames = fqMixinClassNames;
78+
checkTypeNames();
79+
}
80+
81+
private void checkTypeNames() {
82+
// GH-6634
83+
// avoid getting types from the index with an empty string
84+
boolean checkEnabled = false;
85+
assert checkEnabled = true;
86+
if (checkEnabled) {
87+
if (superClass != null) {
88+
assert !superClass.getName().isEmpty();
89+
}
90+
for (QualifiedName name : possibleFQSuperClassNames) {
91+
assert !name.getName().isEmpty();
92+
}
93+
for (QualifiedName usedTrait : usedTraits) {
94+
assert !usedTrait.getName().isEmpty();
95+
}
96+
for (QualifiedName className : fqMixinClassNames) {
97+
assert !className.getName().isEmpty();
98+
}
99+
}
75100
}
76101

77102
public static Set<ClassElement> fromSignature(final IndexQueryImpl indexScopeQuery, final IndexResult indexResult) {
@@ -81,7 +106,7 @@ public static Set<ClassElement> fromSignature(final IndexQueryImpl indexScopeQue
81106
public static Set<ClassElement> fromSignature(final NameKind query,
82107
final IndexQueryImpl indexScopeQuery, final IndexResult indexResult) {
83108
String[] values = indexResult.getValues(IDX_FIELD);
84-
Set<ClassElement> retval = values.length > 0 ? new HashSet<ClassElement>() : Collections.<ClassElement>emptySet();
109+
Set<ClassElement> retval = values.length > 0 ? new HashSet<>() : Collections.<ClassElement>emptySet();
85110
for (String val : values) {
86111
final ClassElement clz = fromSignature(query, indexScopeQuery, Signature.get(val));
87112
if (clz != null) {
@@ -142,14 +167,15 @@ public PhpElementKind getPhpElementKind() {
142167
return KIND;
143168
}
144169

170+
@CheckForNull
145171
@Override
146172
public QualifiedName getSuperClassName() {
147173
return superClass;
148174
}
149175

150176
@Override
151177
public Collection<QualifiedName> getPossibleFQSuperClassNames() {
152-
return this.possibleFQSuperClassNames;
178+
return Collections.unmodifiableCollection(possibleFQSuperClassNames);
153179
}
154180

155181
@Override
@@ -293,7 +319,7 @@ public boolean isAnonymous() {
293319

294320
@Override
295321
public Collection<QualifiedName> getUsedTraits() {
296-
return usedTraits;
322+
return Collections.unmodifiableCollection(usedTraits);
297323
}
298324

299325
private static class ClassSignatureParser {
@@ -382,9 +408,13 @@ int getFlags() {
382408
public Collection<QualifiedName> getUsedTraits() {
383409
Collection<QualifiedName> retval = new HashSet<>();
384410
String traits = signature.string(7);
385-
final String[] traitNames = traits.split(Separator.COMMA.toString());
411+
final String[] traitNames = CodeUtils.COMMA_PATTERN.split(traits);
386412
for (String trait : traitNames) {
387-
retval.add(QualifiedName.create(trait));
413+
if (!trait.isEmpty()) {
414+
// GH-6634
415+
// avoid getting traits from the index with an empty string
416+
retval.add(QualifiedName.create(trait));
417+
}
388418
}
389419
return retval;
390420
}
@@ -400,9 +430,13 @@ String getFileUrl() {
400430
public Collection<QualifiedName> getFQMixinClassNames() {
401431
Collection<QualifiedName> retval = new HashSet<>();
402432
String mixins = signature.string(10);
403-
final String[] mixinNames = mixins.split(Separator.COMMA.toString());
433+
final String[] mixinNames = CodeUtils.COMMA_PATTERN.split(mixins);
404434
for (String mixinName : mixinNames) {
405-
retval.add(QualifiedName.create(mixinName));
435+
if (!mixinName.isEmpty()) {
436+
// GH-6634
437+
// avoid getting mixins from the index with an empty string
438+
retval.add(QualifiedName.create(mixinName));
439+
}
406440
}
407441
return retval;
408442
}

php/php.editor/src/org/netbeans/modules/php/editor/elements/IndexQueryImpl.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import org.netbeans.modules.php.api.editor.PhpClass;
4343
import org.netbeans.modules.php.api.editor.PhpType;
4444
import org.netbeans.modules.php.api.editor.PhpVariable;
45+
import org.netbeans.modules.php.api.util.StringUtils;
4546
import org.netbeans.modules.php.editor.api.AbstractElementQuery;
4647
import org.netbeans.modules.php.editor.api.AliasedName;
4748
import org.netbeans.modules.php.editor.api.ElementQuery;
@@ -1254,6 +1255,9 @@ private Set<TypeMemberElement> getDirectInheritedTypeMembers(final TypeElement t
12541255
TraitedElement traitedElement = (TraitedElement) typeElement;
12551256
Collection<QualifiedName> usedTraits = traitedElement.getUsedTraits();
12561257
for (QualifiedName trait : usedTraits) {
1258+
if (StringUtils.isEmpty(trait.getName())) {
1259+
continue;
1260+
}
12571261
final Set<TypeMemberElement> traitTypes = new LinkedHashSet<>();
12581262
if (memberKinds.size() != 1) {
12591263
traitTypes.addAll(ElementFilter.forFiles(typeElement.getFileObject()).prefer(getTypeMembers(NameKind.exact(trait), NameKind.empty())));
@@ -1298,7 +1302,7 @@ private Set<TypeMemberElement> getDirectMixinTypeMembers(final TypeElement typeE
12981302

12991303
private Set<TypeMemberElement> getDirectInheritedClassTypes(QualifiedName superClassName, EnumSet<PhpElementKind> memberKinds, final TypeElement typeElement) {
13001304
final Set<TypeMemberElement> classTypes = new LinkedHashSet<>();
1301-
if (superClassName != null) {
1305+
if (superClassName != null && !StringUtils.isEmpty(superClassName.getName())) {
13021306
classTypes.addAll(extendedQuery.getFields(NameKind.exact(superClassName), NameKind.empty()));
13031307
classTypes.addAll(extendedQuery.getMethods(NameKind.exact(superClassName), NameKind.empty()));
13041308
classTypes.addAll(extendedQuery.getTypeConstants(NameKind.exact(superClassName), NameKind.empty()));

php/php.editor/src/org/netbeans/modules/php/editor/elements/TraitElementImpl.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.util.HashSet;
2424
import java.util.Set;
2525
import org.netbeans.modules.parsing.spi.indexing.support.IndexResult;
26+
import org.netbeans.modules.php.editor.CodeUtils;
2627
import org.netbeans.modules.php.editor.api.ElementQuery;
2728
import org.netbeans.modules.php.editor.api.NameKind;
2829
import org.netbeans.modules.php.editor.api.PhpElementKind;
@@ -43,7 +44,7 @@
4344
*/
4445
public final class TraitElementImpl extends TypeElementImpl implements TraitElement {
4546
public static final String IDX_FIELD = PHPIndexer.FIELD_TRAIT;
46-
private Collection<QualifiedName> usedTraits;
47+
private final Collection<QualifiedName> usedTraits;
4748

4849
private TraitElementImpl(
4950
final QualifiedName qualifiedName,
@@ -86,7 +87,7 @@ private static TraitElement fromSignature(NameKind query, IndexQueryImpl indexSc
8687

8788
public static Set<TraitElement> fromSignature(final NameKind query, final IndexQueryImpl indexScopeQuery, final IndexResult indexResult) {
8889
String[] values = indexResult.getValues(IDX_FIELD);
89-
Set<TraitElement> retval = values.length > 0 ? new HashSet<TraitElement>() : Collections.<TraitElement>emptySet();
90+
Set<TraitElement> retval = values.length > 0 ? new HashSet<>() : Collections.<TraitElement>emptySet();
9091
for (String val : values) {
9192
final TraitElement trait = fromSignature(query, indexScopeQuery, Signature.get(val));
9293
if (trait != null) {
@@ -161,7 +162,7 @@ public String asString(PrintAs as) {
161162

162163
@Override
163164
public Collection<QualifiedName> getUsedTraits() {
164-
return usedTraits;
165+
return Collections.unmodifiableCollection(usedTraits);
165166
}
166167

167168
private static class TraitSignatureParser {
@@ -183,9 +184,13 @@ int getOffset() {
183184
private Collection<QualifiedName> getUsedTraits() {
184185
Collection<QualifiedName> retval = new HashSet<>();
185186
String traits = signature.string(4);
186-
final String[] traitNames = traits.split(Separator.COMMA.toString());
187+
final String[] traitNames = CodeUtils.COMMA_PATTERN.split(traits);
187188
for (String trait : traitNames) {
188-
retval.add(QualifiedName.create(trait));
189+
if (!trait.isEmpty()) {
190+
// GH-6634
191+
// avoid getting traits from the index with an empty string
192+
retval.add(QualifiedName.create(trait));
193+
}
189194
}
190195
return retval;
191196
}

php/php.editor/src/org/netbeans/modules/php/editor/model/impl/ClassScopeImpl.java

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,11 @@ void addElement(ModelElementImpl element) {
114114
this.superClass = Union2.<String, List<ClassScopeImpl>>createFirst(null);
115115
}
116116
for (QualifiedName usedTrait : nodeInfo.getUsedTraits()) {
117-
usedTraits.add(VariousUtils.getFullyQualifiedName(usedTrait, nodeInfo.getOriginalNode().getStartOffset(), inScope));
117+
if (!usedTrait.getName().isEmpty()) {
118+
// GH-6634
119+
// avoid getting traits from the index with an empty string
120+
usedTraits.add(VariousUtils.getFullyQualifiedName(usedTrait, nodeInfo.getOriginalNode().getStartOffset(), inScope));
121+
}
118122
}
119123
}
120124

@@ -139,7 +143,12 @@ void addElement(ModelElementImpl element) {
139143
this.superClass = Union2.<String, List<ClassScopeImpl>>createFirst(null);
140144
}
141145
for (QualifiedName usedTrait : nodeInfo.getUsedTraits()) {
142-
usedTraits.add(VariousUtils.getFullyQualifiedName(usedTrait, nodeInfo.getOriginalNode().getStartOffset(), inScope));
146+
QualifiedName fullyQualifiedName = VariousUtils.getFullyQualifiedName(usedTrait, nodeInfo.getOriginalNode().getStartOffset(), inScope);
147+
if (!fullyQualifiedName.getName().isEmpty()) {
148+
// GH-6634
149+
// avoid getting traits from the index with an empty string
150+
usedTraits.add(fullyQualifiedName);
151+
}
143152
}
144153
}
145154

@@ -493,6 +502,7 @@ public String getIndexSignature() {
493502
} else {
494503
first = true;
495504
}
505+
assert !qualifiedName.getName().isEmpty();
496506
sb.append(qualifiedName.toString());
497507
}
498508
}
@@ -529,6 +539,7 @@ public String getIndexSignature() {
529539
if (traitSb.length() > 0) {
530540
traitSb.append(","); //NOI18N
531541
}
542+
assert !usedTrait.getName().isEmpty();
532543
traitSb.append(usedTrait.toString());
533544
}
534545
sb.append(traitSb);
@@ -542,6 +553,7 @@ public String getIndexSignature() {
542553
if (mixinSb.length() > 0) {
543554
mixinSb.append(","); // NOI18N
544555
}
556+
assert !mixinClassName.getName().isEmpty();
545557
mixinSb.append(mixinClassName.toString());
546558
}
547559
sb.append(mixinSb);
@@ -654,7 +666,7 @@ public boolean isAnonymous() {
654666

655667
@Override
656668
public Collection<QualifiedName> getUsedTraits() {
657-
return usedTraits;
669+
return Collections.unmodifiableCollection(usedTraits);
658670
}
659671

660672
@Override
@@ -748,14 +760,14 @@ public String toString() {
748760
sb.append(" extends ").append(extClass.getName()); //NOI18N
749761
}
750762
List<? extends InterfaceScope> implementedInterfaces = getSuperInterfaceScopes();
751-
if (implementedInterfaces.size() > 0) {
763+
if (!implementedInterfaces.isEmpty()) {
752764
sb.append(" implements "); //NOI18N
753765
for (InterfaceScope interfaceScope : implementedInterfaces) {
754766
sb.append(interfaceScope.getName()).append(" ");
755767
}
756768
}
757769
Collection<? extends TraitScope> traits = getTraits();
758-
if (traits.size() > 0) {
770+
if (!traits.isEmpty()) {
759771
sb.append(" uses "); //NOI18N
760772
for (TraitScope traitScope : traits) {
761773
sb.append(traitScope.getName()).append(" ");

php/php.editor/src/org/netbeans/modules/php/editor/model/impl/OccurenceBuilder.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2460,7 +2460,11 @@ private void buildVariables(ElementInfo nodeCtxInfo, FileScopeImpl fileScope, fi
24602460
}
24612461
ASTNodeInfo<Variable> nodeInfo = entry.getKey();
24622462
boolean addOccurence = false;
2463-
if (NameKind.exact(nodeInfo.getName()).matchesName(PhpElementKind.VARIABLE, nodeName)) {
2463+
String name = nodeInfo.getName();
2464+
if (!StringUtils.hasText(name)) {
2465+
continue;
2466+
}
2467+
if (NameKind.exact(name).matchesName(PhpElementKind.VARIABLE, nodeName)) {
24642468
if (!var.isGloballyVisible()) {
24652469
Scope nextScope = entry.getValue();
24662470
if (var.representsThis() && nextScope.getInScope() instanceof TypeScope) {

php/php.editor/src/org/netbeans/modules/php/editor/parser/api/Utils.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -75,12 +75,19 @@ public static Comment getCommentForNode(Program root, ASTNode node) {
7575
}
7676
}
7777
if (possible != null && (possible.getEndOffset() + 1 < node.getStartOffset())) {
78-
List<ASTNode> nodes = (new NodeRangeLocator()).locate(root, new OffsetRange(possible.getEndOffset() + 1, getNodeRangeLocatorEndOffset(node)));
79-
if (!nodes.isEmpty()) {
80-
if (!isConstantDeclaration(nodes, node)
81-
&& !isFieldDeclaration(nodes, node)) {
82-
possible = null;
78+
int start = possible.getEndOffset() + 1;
79+
int end = getNodeRangeLocatorEndOffset(node);
80+
if (start <= end) {
81+
List<ASTNode> nodes = (new NodeRangeLocator()).locate(root, new OffsetRange(start, end));
82+
if (!nodes.isEmpty()) {
83+
if (!isConstantDeclaration(nodes, node)
84+
&& !isFieldDeclaration(nodes, node)) {
85+
possible = null;
86+
}
8387
}
88+
} else {
89+
// e.g. public self|A /* comment */ |null $unionType; (start > end)
90+
possible = null;
8491
}
8592
}
8693
}

0 commit comments

Comments
 (0)