Skip to content

Commit 6e7299e

Browse files
authored
Merge pull request #12885 from tanishiking/semanticdb-signature
Signature information in Semanticdb
2 parents 31292be + 056f4a4 commit 6e7299e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+3501
-2229
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package dotty.tools
2+
package dotc
3+
package semanticdb
4+
5+
import dotty.tools.dotc.{semanticdb => s}
6+
7+
import core.Contexts.Context
8+
import core.Constants._
9+
10+
object ConstantOps:
11+
extension (const: Constant)
12+
def toSemanticConst(using Context): s.Constant = const.tag match {
13+
case UnitTag => s.UnitConstant()
14+
case BooleanTag => s.BooleanConstant(const.booleanValue)
15+
case ByteTag => s.ByteConstant(const.byteValue)
16+
case ShortTag => s.ShortConstant(const.shortValue)
17+
case CharTag => s.CharConstant(const.charValue)
18+
case IntTag => s.IntConstant(const.intValue)
19+
case LongTag => s.LongConstant(const.longValue)
20+
case FloatTag => s.FloatConstant(const.floatValue)
21+
case DoubleTag => s.DoubleConstant(const.doubleValue)
22+
case StringTag => s.StringConstant(const.stringValue)
23+
case NullTag => s.NullConstant()
24+
case _ => throw new Error(s"Constant ${const} can't be converted to Semanticdb Constant.")
25+
}
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
package dotty.tools.dotc.semanticdb
2+
3+
import java.lang.System.{lineSeparator => EOL}
4+
import dotty.tools.dotc.semanticdb.{Descriptor => d}
5+
6+
class DescriptorParser(s: String) {
7+
var i = s.length
8+
def fail() = {
9+
val message = "invalid symbol format"
10+
val caret = " " * i + "^"
11+
sys.error(s"$message$EOL$s$EOL$caret")
12+
}
13+
14+
val BOF = '\u0000'
15+
val EOF = '\u001A'
16+
var currChar = EOF
17+
def readChar(): Char = {
18+
if (i <= 0) {
19+
if (i == 0) {
20+
i -= 1
21+
currChar = BOF
22+
currChar
23+
} else {
24+
fail()
25+
}
26+
} else {
27+
i -= 1
28+
currChar = s(i)
29+
currChar
30+
}
31+
}
32+
33+
def parseValue(): String = {
34+
if (currChar == '`') {
35+
val end = i
36+
while (readChar() != '`') {}
37+
readChar()
38+
s.substring(i + 2, end)
39+
} else {
40+
val end = i + 1
41+
if (!Character.isJavaIdentifierPart(currChar)) fail()
42+
while (Character.isJavaIdentifierPart(readChar()) && currChar != BOF) {}
43+
s.substring(i + 1, end)
44+
}
45+
}
46+
47+
def parseDisambiguator(): String = {
48+
val end = i + 1
49+
if (currChar != ')') fail()
50+
while (readChar() != '(') {}
51+
readChar()
52+
s.substring(i + 1, end)
53+
}
54+
55+
def parseDescriptor(): Descriptor = {
56+
if (currChar == '.') {
57+
readChar()
58+
if (currChar == ')') {
59+
val disambiguator = parseDisambiguator()
60+
val value = parseValue()
61+
d.Method(value, disambiguator)
62+
} else {
63+
d.Term(parseValue())
64+
}
65+
} else if (currChar == '#') {
66+
readChar()
67+
d.Type(parseValue())
68+
} else if (currChar == '/') {
69+
readChar()
70+
d.Package(parseValue())
71+
} else if (currChar == ')') {
72+
readChar()
73+
val value = parseValue()
74+
if (currChar != '(') fail()
75+
else readChar()
76+
d.Parameter(value)
77+
} else if (currChar == ']') {
78+
readChar()
79+
val value = parseValue()
80+
if (currChar != '[') fail()
81+
else readChar()
82+
d.TypeParameter(value)
83+
} else {
84+
fail()
85+
}
86+
}
87+
88+
def entryPoint(): (Descriptor, String) = {
89+
readChar()
90+
val desc = parseDescriptor()
91+
(desc, s.substring(0, i + 1))
92+
}
93+
}
94+
95+
object DescriptorParser {
96+
def apply(symbol: String): (Descriptor, String) = {
97+
val parser = new DescriptorParser(symbol)
98+
parser.entryPoint()
99+
}
100+
}
101+
102+
sealed trait Descriptor {
103+
def isNone: Boolean = this == d.None
104+
def isTerm: Boolean = this.isInstanceOf[d.Term]
105+
def isMethod: Boolean = this.isInstanceOf[d.Method]
106+
def isType: Boolean = this.isInstanceOf[d.Type]
107+
def isPackage: Boolean = this.isInstanceOf[d.Package]
108+
def isParameter: Boolean = this.isInstanceOf[d.Parameter]
109+
def isTypeParameter: Boolean = this.isInstanceOf[d.TypeParameter]
110+
def value: String
111+
}
112+
object Descriptor {
113+
case object None extends Descriptor { def value: String = "" }
114+
final case class Term(value: String) extends Descriptor
115+
final case class Method(value: String, disambiguator: String) extends Descriptor
116+
final case class Type(value: String) extends Descriptor
117+
final case class Package(value: String) extends Descriptor
118+
final case class Parameter(value: String) extends Descriptor
119+
final case class TypeParameter(value: String) extends Descriptor
120+
}

0 commit comments

Comments
 (0)