Skip to content

Commit 086f99f

Browse files
committed
Add support for abstract fields and methods
1 parent 9fdb017 commit 086f99f

File tree

7 files changed

+28
-24
lines changed

7 files changed

+28
-24
lines changed

samples/abstract.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
declare abstract class AbstractClass {
2-
property: String;
3-
method(): void;
2+
abstract abstractField: String;
3+
abstract abstractMethod(): void;
44
}

samples/abstract.ts.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ package `abstract` {
88
@js.native
99
@JSGlobal
1010
abstract class AbstractClass extends js.Object {
11-
var property: String = js.native
12-
def method(): Unit = js.native
11+
var abstractField: String
12+
def abstractMethod(): Unit
1313
}
1414

1515
}

src/main/scala/org/scalajs/tools/tsimporter/Importer.scala

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ class Importer(val output: java.io.PrintWriter) {
6363
m.protectName()
6464
m.tpe = TypeRef(tsym.name)
6565
}
66-
val applySym = sym.newMethod(Name("apply"))
66+
val applySym = sym.newMethod(Name("apply"), Set.empty[Modifier])
6767
applySym.params += new ParamSymbol(Name("value"), TypeRef(tsym.name))
6868
applySym.resultType = TypeRef.String
6969
applySym.isBracketAccess = true
@@ -83,7 +83,7 @@ class Importer(val output: java.io.PrintWriter) {
8383
processMembersDecls(owner, sym, members)
8484
if (!sym.members.exists(_.name == Name.CONSTRUCTOR)) {
8585
processDefDecl(sym, Name.CONSTRUCTOR,
86-
FunSignature(Nil, Nil, Some(TypeRefTree(CoreType("void")))))
86+
FunSignature(Nil, Nil, Some(TypeRefTree(CoreType("void")))), Set.empty[Modifier])
8787
}
8888

8989
case InterfaceDecl(TypeNameName(name), tparams, inheritance, members) =>
@@ -115,7 +115,7 @@ class Importer(val output: java.io.PrintWriter) {
115115
sym.tpe = typeToScala(tpe)
116116

117117
case FunctionDecl(IdentName(name), signature) =>
118-
processDefDecl(owner, name, signature)
118+
processDefDecl(owner, name, signature, Set.empty[Modifier])
119119

120120
case ImportDecl => // Ignore imports
121121

@@ -140,14 +140,14 @@ class Importer(val output: java.io.PrintWriter) {
140140

141141
for (member <- members) member match {
142142
case CallMember(signature) =>
143-
processDefDecl(owner, Name("apply"), signature, protectName = false)
143+
processDefDecl(owner, Name("apply"), signature, Set.empty[Modifier], protectName = false)
144144

145145
case ConstructorMember(sig @ FunSignature(tparamsIgnored, params, Some(resultType)))
146146
if owner.isInstanceOf[ModuleSymbol] && resultType == companionClassRef =>
147147
val classSym = enclosing.getClassOrCreate(owner.name)
148148
classSym.isTrait = false
149149
processDefDecl(classSym, Name.CONSTRUCTOR,
150-
FunSignature(Nil, params, Some(TypeRefTree(CoreType("void")))))
150+
FunSignature(Nil, params, Some(TypeRefTree(CoreType("void")))), Set.empty[Modifier])
151151

152152
case PropertyMember(PropertyNameName(name), opt, tpe, mods) if mods(Modifier.Static) =>
153153
assert(owner.isInstanceOf[ClassSymbol],
@@ -162,28 +162,28 @@ class Importer(val output: java.io.PrintWriter) {
162162
if owner.isInstanceOf[ClassSymbol] && !modifiers(Modifier.Static) =>
163163
owner.asInstanceOf[ClassSymbol].isTrait = false
164164
processDefDecl(owner, Name.CONSTRUCTOR,
165-
FunSignature(Nil, signature.params, Some(TypeRefTree(CoreType("void")))))
165+
FunSignature(Nil, signature.params, Some(TypeRefTree(CoreType("void")))), modifiers)
166166

167167
case FunctionMember(PropertyNameName(name), opt, signature, modifiers)
168168
if modifiers(Modifier.Static) =>
169169
assert(owner.isInstanceOf[ClassSymbol],
170170
s"Cannot process static member $name in module definition")
171171
val module = enclosing.getModuleOrCreate(owner.name)
172-
processDefDecl(module, name, signature)
172+
processDefDecl(module, name, signature, modifiers)
173173

174-
case FunctionMember(PropertyNameName(name), opt, signature, _) =>
175-
processDefDecl(owner, name, signature)
174+
case FunctionMember(PropertyNameName(name), opt, signature, modifiers) =>
175+
processDefDecl(owner, name, signature, modifiers)
176176

177177
case IndexMember(IdentName(indexName), indexType, valueType) =>
178178
val indexTpe = typeToScala(indexType)
179179
val valueTpe = typeToScala(valueType)
180180

181-
val getterSym = owner.newMethod(Name("apply"))
181+
val getterSym = owner.newMethod(Name("apply"), Set.empty[Modifier])
182182
getterSym.params += new ParamSymbol(indexName, indexTpe)
183183
getterSym.resultType = valueTpe
184184
getterSym.isBracketAccess = true
185185

186-
val setterSym = owner.newMethod(Name("update"))
186+
val setterSym = owner.newMethod(Name("update"), Set.empty[Modifier])
187187
setterSym.params += new ParamSymbol(indexName, indexTpe)
188188
setterSym.params += new ParamSymbol(Name("v"), valueTpe)
189189
setterSym.resultType = TypeRef.Unit
@@ -201,7 +201,7 @@ class Importer(val output: java.io.PrintWriter) {
201201
case ObjectType(members) if members.forall(_.isInstanceOf[CallMember]) =>
202202
// alternative notation for overload methods - #3
203203
for (CallMember(signature) <- members)
204-
processDefDecl(owner, name, signature, protectName)
204+
processDefDecl(owner, name, signature, modifiers, protectName)
205205
case _ =>
206206
val sym = owner.newField(name, modifiers)
207207
if (protectName)
@@ -212,12 +212,12 @@ class Importer(val output: java.io.PrintWriter) {
212212
}
213213

214214
private def processDefDecl(owner: ContainerSymbol, name: Name,
215-
signature: FunSignature, protectName: Boolean = true) {
215+
signature: FunSignature, modifiers: Modifiers, protectName: Boolean = true) {
216216
// Discard specialized signatures
217217
if (signature.params.exists(_.tpe.exists(_.isInstanceOf[ConstantType])))
218218
return
219219

220-
val sym = owner.newMethod(name)
220+
val sym = owner.newMethod(name, modifiers)
221221
if (protectName)
222222
sym.protectName()
223223

src/main/scala/org/scalajs/tools/tsimporter/Trees.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ object Trees {
3636
case object Static extends Modifier
3737
case object ReadOnly extends Modifier
3838
case object Const extends Modifier
39+
case object Abstract extends Modifier
3940
}
4041

4142
type Modifiers = Set[Modifier]

src/main/scala/org/scalajs/tools/tsimporter/parser/TSDefParser.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,8 @@ class TSDefParser extends StdTokenParsers with ImplicitConversions {
297297
| "public" ^^^ Modifier.Public
298298
| "readonly" ^^^ Modifier.ReadOnly
299299
| "protected" ^^^ Modifier.Protected
300-
)
300+
| lexical.Identifier("abstract") ^^^ Modifier.Abstract
301+
)
301302

302303
lazy val identifier =
303304
identifierName ^^ Ident

src/main/scala/org/scalajs/tools/tsimporter/sc/Definitions.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,8 @@ class ContainerSymbol(nme: Name) extends Symbol(nme) {
140140
result
141141
}
142142

143-
def newMethod(name: Name): MethodSymbol = {
144-
val result = new MethodSymbol(name)
143+
def newMethod(name: Name, modifiers: Modifiers): MethodSymbol = {
144+
val result = new MethodSymbol(name, modifiers)
145145
members += result
146146
result
147147
}
@@ -207,7 +207,7 @@ class FieldSymbol(nme: Name, val modifiers: Modifiers) extends Symbol(nme) with
207207
override def toString() = s"${jsNameStr}${if (modifiers(Modifier.ReadOnly)) "val" else "var"} $name: $tpe"
208208
}
209209

210-
class MethodSymbol(nme: Name) extends Symbol(nme) with JSNameable {
210+
class MethodSymbol(nme: Name, val modifiers: Modifiers) extends Symbol(nme) with JSNameable {
211211
val tparams = new ListBuffer[TypeParamSymbol]
212212
val params = new ListBuffer[ParamSymbol]
213213
var resultType: TypeRef = TypeRef.Dynamic

src/main/scala/org/scalajs/tools/tsimporter/sc/Printer.scala

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,8 @@ class Printer(private val output: PrintWriter, outputPackage: String) {
139139
if (sym.modifiers(Modifier.Const)) "val"
140140
else if (sym.modifiers(Modifier.ReadOnly)) "def"
141141
else "var"
142-
pln" $access$decl $name: ${sym.tpe} = js.native"
142+
p" $access$decl $name: ${sym.tpe}"
143+
pln"${if (sym.modifiers(Modifier.Abstract)) "" else " = js.native"}"
143144

144145
case sym: MethodSymbol =>
145146
val params = sym.params
@@ -158,7 +159,8 @@ class Printer(private val output: PrintWriter, outputPackage: String) {
158159
p" ${modifiers}def $name"
159160
if (!sym.tparams.isEmpty)
160161
p"[${sym.tparams}]"
161-
pln"($params): ${sym.resultType} = js.native"
162+
p"($params): ${sym.resultType}"
163+
pln"${if (sym.modifiers(Modifier.Abstract)) "" else " = js.native"}"
162164
}
163165

164166
case sym: ParamSymbol =>

0 commit comments

Comments
 (0)