Skip to content

Commit b4fb93f

Browse files
committed
fix: js qualified name parent
1 parent a804732 commit b4fb93f

File tree

3 files changed

+152
-11
lines changed

3 files changed

+152
-11
lines changed

src/main/kotlin/spp/protocol/artifact/ArtifactQualifiedName.kt

Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -68,25 +68,55 @@ data class ArtifactQualifiedName(
6868

6969
fun asParent(): ArtifactQualifiedName? {
7070
return when {
71-
type == ArtifactType.CLASS -> null
71+
type == ArtifactType.CLASS -> {
72+
if (identifier.contains(":")) {
73+
val filename = identifier.substringBeforeLast(":")
74+
ArtifactQualifiedName(filename, commitId, ArtifactType.FILE)
75+
} else {
76+
null
77+
}
78+
}
7279

73-
type == ArtifactType.METHOD -> ArtifactQualifiedName(
74-
identifier.substringBefore("(").substringBeforeLast("."),
75-
commitId,
76-
ArtifactType.CLASS
77-
)
80+
type == ArtifactType.METHOD -> {
81+
if (identifier.contains(":")) {
82+
val filename = identifier.substringBeforeLast(":")
83+
val fullOperationName = identifier.substringAfterLast(":")
84+
if (fullOperationName.substringBefore("(").contains(".")) {
85+
val className = fullOperationName.substringBeforeLast(".")
86+
ArtifactQualifiedName("$filename:$className", commitId, ArtifactType.CLASS)
87+
} else {
88+
ArtifactQualifiedName(filename, commitId, ArtifactType.FILE)
89+
}
90+
} else {
91+
ArtifactQualifiedName(
92+
identifier.substringBefore("(").substringBeforeLast("."),
93+
commitId,
94+
ArtifactType.CLASS
95+
)
96+
}
97+
}
7898

7999
type == ArtifactType.EXPRESSION && identifier.contains("(") -> ArtifactQualifiedName(
80100
identifier.substringBefore("#"),
81101
commitId,
82102
ArtifactType.METHOD
83103
)
84104

85-
type == ArtifactType.EXPRESSION -> ArtifactQualifiedName(
86-
identifier.substringBefore("#"),
87-
commitId,
88-
ArtifactType.CLASS
89-
)
105+
type == ArtifactType.EXPRESSION -> {
106+
if (identifier.contains("/")) {
107+
ArtifactQualifiedName(
108+
identifier.substringBefore("#"),
109+
commitId,
110+
ArtifactType.FILE
111+
)
112+
} else {
113+
ArtifactQualifiedName(
114+
identifier.substringBefore("#"),
115+
commitId,
116+
ArtifactType.CLASS
117+
)
118+
}
119+
}
90120

91121
else -> null
92122
}

src/main/kotlin/spp/protocol/artifact/ArtifactType.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ package spp.protocol.artifact
2323
* @author [Brandon Fergerson](mailto:[email protected])
2424
*/
2525
enum class ArtifactType {
26+
FILE,
2627
CLASS,
2728
METHOD,
2829
STATEMENT,

src/test/kotlin/spp/protocol/artifact/ArtifactQualifiedNameTest.kt

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,116 @@ import spp.protocol.artifact.ArtifactType.*
2222

2323
class ArtifactQualifiedNameTest {
2424

25+
@Test
26+
fun `test js parent chain`() {
27+
ArtifactQualifiedName(
28+
identifier = "C:/test/main.js#SlNDYWxsRXhwcmVzc2lvbg==",
29+
type = EXPRESSION
30+
).let {
31+
val fileParent = it.asParent()
32+
assertNotNull(fileParent)
33+
assertEquals(
34+
"C:/test/main.js",
35+
fileParent!!.identifier
36+
)
37+
assertEquals(fileParent.type, FILE)
38+
39+
assertNull(fileParent.asParent())
40+
}
41+
42+
ArtifactQualifiedName(
43+
identifier = "C:/test/main.js:executeDemos()",
44+
type = METHOD
45+
).let {
46+
val fileParent = it.asParent()
47+
assertNotNull(fileParent)
48+
assertEquals(
49+
"C:/test/main.js",
50+
fileParent!!.identifier
51+
)
52+
assertEquals(fileParent.type, FILE)
53+
54+
assertNull(fileParent.asParent())
55+
}
56+
57+
ArtifactQualifiedName(
58+
identifier = "C:/test/main.js:executeDemos()#SlNDYWxsRXhwcmVzc2lvbg==",
59+
type = EXPRESSION
60+
).let {
61+
val methodParent = it.asParent()
62+
assertNotNull(methodParent)
63+
assertEquals(
64+
"C:/test/main.js:executeDemos()",
65+
methodParent!!.identifier
66+
)
67+
assertEquals(methodParent.type, METHOD)
68+
69+
val fileParent = methodParent.asParent()
70+
assertNotNull(fileParent)
71+
assertEquals(
72+
"C:/test/main.js",
73+
fileParent!!.identifier
74+
)
75+
assertEquals(fileParent.type, FILE)
76+
77+
assertNull(fileParent.asParent())
78+
}
79+
80+
ArtifactQualifiedName(
81+
identifier = "C:/test/main.js:TestClass.executeDemos()",
82+
type = METHOD
83+
).let {
84+
val methodParent = it.asParent()
85+
assertNotNull(methodParent)
86+
assertEquals(
87+
"C:/test/main.js:TestClass",
88+
methodParent!!.identifier
89+
)
90+
assertEquals(methodParent.type, CLASS)
91+
92+
val classParent = methodParent.asParent()
93+
assertNotNull(classParent)
94+
assertEquals(
95+
"C:/test/main.js",
96+
classParent!!.identifier
97+
)
98+
assertEquals(classParent.type, FILE)
99+
100+
assertNull(classParent.asParent())
101+
}
102+
103+
ArtifactQualifiedName(
104+
identifier = "C:/test/main.js:TestClass.executeDemos()#SlNDYWxsRXhwcmVzc2lvbg==",
105+
type = EXPRESSION
106+
).let {
107+
val expressionParent = it.asParent()
108+
assertNotNull(expressionParent)
109+
assertEquals(
110+
"C:/test/main.js:TestClass.executeDemos()",
111+
expressionParent!!.identifier
112+
)
113+
assertEquals(expressionParent.type, METHOD)
114+
115+
val methodParent = expressionParent.asParent()
116+
assertNotNull(methodParent)
117+
assertEquals(
118+
"C:/test/main.js:TestClass",
119+
methodParent!!.identifier
120+
)
121+
assertEquals(methodParent.type, CLASS)
122+
123+
val classParent = methodParent.asParent()
124+
assertNotNull(classParent)
125+
assertEquals(
126+
"C:/test/main.js",
127+
classParent!!.identifier
128+
)
129+
assertEquals(classParent.type, FILE)
130+
131+
assertNull(classParent.asParent())
132+
}
133+
}
134+
25135
@Test
26136
fun `test parent qualified name`() {
27137
val methodExpression = ArtifactQualifiedName("com.example.TestClass.fun()#22", type = EXPRESSION)

0 commit comments

Comments
 (0)