Skip to content

Commit fa1ab77

Browse files
committed
Add UnitImportNameDeclaration::isAlias API method
1 parent 3143498 commit fa1ab77

File tree

5 files changed

+75
-18
lines changed

5 files changed

+75
-18
lines changed

CHANGELOG.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
### Added
11+
12+
- `FullyQualifiedImportCheck` analysis rule, which flags non-fully qualified imports.
13+
- **API:** `UnitImportNameDeclaration::isAlias` method.
14+
1015
### Changed
1116

1217
- Non-trivial `inherited` expressions are excluded in `RedundantParentheses`.
@@ -19,7 +24,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1924

2025
### Added
2126

22-
- `FullyQualifiedImportCheck` analysis rule, which flags non-fully qualified imports.
2327
- **API:** `CaseItemStatementNode::getExpressions` method.
2428

2529
### Changed

delphi-frontend/src/main/java/au/com/integradev/delphi/symbol/SymbolTableBuilder.java

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@
5050
import org.apache.commons.lang3.StringUtils;
5151
import org.slf4j.Logger;
5252
import org.slf4j.LoggerFactory;
53+
import org.sonar.plugins.communitydelphi.api.ast.QualifiedNameDeclarationNode;
5354
import org.sonar.plugins.communitydelphi.api.ast.UnitImportNode;
54-
import org.sonar.plugins.communitydelphi.api.symbol.Qualifiable;
5555
import org.sonar.plugins.communitydelphi.api.symbol.declaration.NameDeclaration;
5656
import org.sonar.plugins.communitydelphi.api.symbol.declaration.RoutineDirective;
5757
import org.sonar.plugins.communitydelphi.api.symbol.declaration.TypeNameDeclaration;
@@ -202,7 +202,17 @@ private void createUnitData(Path unitPath, boolean isSourceFile) {
202202

203203
private UnitImportNameDeclaration createImportDeclaration(
204204
UnitNameDeclaration unit, UnitImportNode node) {
205-
UnitData data = searchForImport(unit, node.getNameNode());
205+
QualifiedNameDeclarationNode nameNode = node.getNameNode();
206+
207+
String importName = nameNode.fullyQualifiedName();
208+
String aliased = unitAliases.get(importName);
209+
210+
boolean alias = aliased != null;
211+
if (alias) {
212+
importName = aliased;
213+
}
214+
215+
UnitData data = searchForImport(unit, importName, nameNode.isQualified());
206216

207217
UnitNameDeclaration unitDeclaration = null;
208218
if (data != null) {
@@ -214,18 +224,12 @@ private UnitImportNameDeclaration createImportDeclaration(
214224
LOG.debug("{}X {} **Failed to locate unit**", indentation, unitName);
215225
}
216226

217-
return new UnitImportNameDeclarationImpl(node, unitDeclaration);
227+
return new UnitImportNameDeclarationImpl(node, alias, unitDeclaration);
218228
}
219229

220230
@Nullable
221-
private UnitData searchForImport(UnitNameDeclaration unit, Qualifiable qualifiableImportName) {
222-
String importName = qualifiableImportName.fullyQualifiedName();
223-
String aliased = unitAliases.get(importName);
224-
225-
if (aliased != null) {
226-
importName = aliased;
227-
}
228-
231+
private UnitData searchForImport(
232+
UnitNameDeclaration unit, String importName, boolean isQualified) {
229233
UnitData data = findImportByName(unit, importName);
230234

231235
if (data == null) {
@@ -239,7 +243,7 @@ private UnitData searchForImport(UnitNameDeclaration unit, Qualifiable qualifiab
239243

240244
if (data == null) {
241245
String namespace = unit.getNamespace();
242-
if (!qualifiableImportName.isQualified() && !namespace.isEmpty()) {
246+
if (!isQualified && !namespace.isEmpty()) {
243247
data = findImportByName(unit, namespace + "." + importName);
244248
}
245249
}

delphi-frontend/src/main/java/au/com/integradev/delphi/symbol/declaration/UnitImportNameDeclarationImpl.java

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,23 +18,36 @@
1818
*/
1919
package au.com.integradev.delphi.symbol.declaration;
2020

21+
import static java.util.Comparator.naturalOrder;
22+
import static java.util.Comparator.nullsLast;
23+
24+
import com.google.common.collect.ComparisonChain;
2125
import java.util.Objects;
26+
import javax.annotation.Nonnull;
2227
import javax.annotation.Nullable;
2328
import org.sonar.plugins.communitydelphi.api.ast.UnitImportNode;
29+
import org.sonar.plugins.communitydelphi.api.symbol.declaration.NameDeclaration;
2430
import org.sonar.plugins.communitydelphi.api.symbol.declaration.UnitImportNameDeclaration;
2531
import org.sonar.plugins.communitydelphi.api.symbol.declaration.UnitNameDeclaration;
2632
import org.sonar.plugins.communitydelphi.api.symbol.scope.FileScope;
2733

2834
public final class UnitImportNameDeclarationImpl extends QualifiedNameDeclarationImpl
2935
implements UnitImportNameDeclaration {
36+
private final boolean alias;
3037
private final UnitNameDeclaration originalDeclaration;
3138

3239
public UnitImportNameDeclarationImpl(
33-
UnitImportNode node, @Nullable UnitNameDeclaration originalDeclaration) {
40+
UnitImportNode node, boolean alias, @Nullable UnitNameDeclaration originalDeclaration) {
3441
super(node.getNameNode());
42+
this.alias = alias;
3543
this.originalDeclaration = originalDeclaration;
3644
}
3745

46+
@Override
47+
public boolean isAlias() {
48+
return alias;
49+
}
50+
3851
@Override
3952
@Nullable
4053
public UnitNameDeclaration getOriginalDeclaration() {
@@ -54,14 +67,27 @@ public FileScope getUnitScope() {
5467
public boolean equals(Object other) {
5568
if (super.equals(other)) {
5669
UnitImportNameDeclarationImpl that = (UnitImportNameDeclarationImpl) other;
57-
return Objects.equals(originalDeclaration, that.originalDeclaration);
70+
return alias == that.alias && Objects.equals(originalDeclaration, that.originalDeclaration);
5871
}
5972
return false;
6073
}
6174

6275
@Override
6376
public int hashCode() {
64-
return Objects.hash(super.hashCode(), originalDeclaration);
77+
return Objects.hash(super.hashCode(), alias, originalDeclaration);
78+
}
79+
80+
@Override
81+
public int compareTo(@Nonnull NameDeclaration other) {
82+
int result = super.compareTo(other);
83+
if (result == 0) {
84+
UnitImportNameDeclarationImpl that = (UnitImportNameDeclarationImpl) other;
85+
return ComparisonChain.start()
86+
.compareTrueFirst(this.alias, that.alias)
87+
.compare(this.originalDeclaration, that.originalDeclaration, nullsLast(naturalOrder()))
88+
.result();
89+
}
90+
return result;
6591
}
6692

6793
@Override

delphi-frontend/src/main/java/org/sonar/plugins/communitydelphi/api/symbol/declaration/UnitImportNameDeclaration.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import org.sonar.plugins.communitydelphi.api.symbol.scope.FileScope;
2323

2424
public interface UnitImportNameDeclaration extends QualifiedNameDeclaration {
25+
boolean isAlias();
26+
2527
@Nullable
2628
UnitNameDeclaration getOriginalDeclaration();
2729

delphi-frontend/src/test/java/au/com/integradev/delphi/symbol/declaration/UnitImportNameDeclarationTest.java

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,20 +39,32 @@
3939
import org.sonar.plugins.communitydelphi.api.symbol.declaration.UnitNameDeclaration;
4040

4141
class UnitImportNameDeclarationTest {
42+
@Test
43+
void testIsAlias() {
44+
assertThat(createImport("Foo", true).isAlias()).isTrue();
45+
assertThat(createImport("Bar", false).isAlias()).isFalse();
46+
}
47+
4248
@Test
4349
void testEquals() {
4450
UnitImportNameDeclaration foo = createImport("Foo");
4551
UnitImportNameDeclaration otherFoo = createImport("Foo");
52+
UnitImportNameDeclaration aliasFoo = createImport("Foo", true);
4653
UnitImportNameDeclaration differentName = createImport("Bar");
4754
UnitImportNameDeclaration differentOriginalDeclaration = createImport("Foo", createUnit("Foo"));
4855

4956
new EqualsTester()
5057
.addEqualityGroup(foo, otherFoo)
58+
.addEqualityGroup(aliasFoo)
5159
.addEqualityGroup(differentName)
5260
.addEqualityGroup(differentOriginalDeclaration)
5361
.testEquals();
5462

55-
assertThat(foo).isEqualByComparingTo(otherFoo).isNotEqualByComparingTo(differentName);
63+
assertThat(foo)
64+
.isEqualByComparingTo(otherFoo)
65+
.isNotEqualByComparingTo(aliasFoo)
66+
.isNotEqualByComparingTo(differentName)
67+
.isNotEqualByComparingTo(differentOriginalDeclaration);
5668
}
5769

5870
@Test
@@ -64,11 +76,20 @@ private static UnitImportNameDeclaration createImport(String name) {
6476
return createImport(name, null);
6577
}
6678

79+
private static UnitImportNameDeclaration createImport(String name, boolean alias) {
80+
return createImport(name, null, alias);
81+
}
82+
6783
private static UnitImportNameDeclaration createImport(
6884
String name, UnitNameDeclaration originalDeclaration) {
85+
return createImport(name, originalDeclaration, false);
86+
}
87+
88+
private static UnitImportNameDeclaration createImport(
89+
String name, UnitNameDeclaration originalDeclaration, boolean alias) {
6990
var location = new UnitImportNodeImpl(DelphiLexer.TkUnitImport);
7091
location.addChild(createNameNode(name));
71-
return new UnitImportNameDeclarationImpl(location, originalDeclaration);
92+
return new UnitImportNameDeclarationImpl(location, alias, originalDeclaration);
7293
}
7394

7495
private static UnitNameDeclaration createUnit(String name) {

0 commit comments

Comments
 (0)