8000 Remove Infos.ClassInfoBuilder · scala-js/scala-js@caa3e47 · GitHub
[go: up one dir, main page]

Skip to content

Commit caa3e47

Browse files
committed
Remove Infos.ClassInfoBuilder
It was a useful abstraction when we were using Traversers to build entire class infos. However, at this point it's mostly boilerplate. Changeing this, will help simplify upcoming changes.
1 parent 28366ea commit caa3e47

File tree

3 files changed

+38
-80
lines changed

3 files changed

+38
-80
lines changed

linker/shared/src/main/scala/org/scalajs/linker/analyzer/Analyzer.scala

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1507,10 +1507,13 @@ private class AnalyzerRun(config: CommonPhaseConfig, initial: Boolean,
15071507
if (className == ObjectClass) None
15081508
else Some(ObjectClass)
15091509

1510-
new Infos.ClassInfoBuilder(className, ClassKind.Class,
1511-
superClass = superClass, interfaces = Nil, jsNativeLoadSpec = None)
1512-
.addMethod(makeSyntheticMethodInfo(NoArgConstructorName, MemberNamespace.Constructor))
1513-
.result()
1510+
val methods =
1511+
List(makeSyntheticMethodInfo(NoArgConstructorName, MemberNamespace.Constructor))
1512+
1513+
new Infos.ClassInfo(className, ClassKind.Class,
1514+
superClass = superClass, interfaces = Nil, jsNativeLoadSpec = None,
1515+
referencedFieldClasses = Map.empty, methods = methods,
1516+
jsNativeMembers = Map.empty, jsMethodProps = Nil, topLevelExports = Nil)
15141517
}
15151518

15161519
private def makeSyntheticMethodInfo(

linker/shared/src/main/scala/org/scalajs/linker/analyzer/InfoLoader.scala

Lines changed: 13 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -115,40 +115,27 @@ private[analyzer] object InfoLoader {
115115
}
116116

117117
private def generateInfos(classDef: ClassDef): Infos.ClassInfo = {
118-
val builder = new Infos.ClassInfoBuilder(classDef.className,
119-
classDef.kind, classDef.superClass.map(_.name),
120-
classDef.interfaces.map(_.name), classDef.jsNativeLoadSpec)
118+
val referencedFieldClasses = Infos.genReferencedFieldClasses(classDef.fields)
119+
val methods = classDef.methods.map(methodsInfoCaches.getInfo(_))
121120

122-
classDef.fields.foreach {
123-
case FieldDef(flags, FieldIdent(name), _, ftpe) =>
124-
if (!flags.namespace.isStatic)
125-
builder.maybeAddReferencedFieldClass(name, ftpe)
126-
127-
case _: JSFieldDef =>
128-
// Nothing to do.
129-
}
130-
131-
classDef.methods.foreach { method =>
132-
builder.addMethod(methodsInfoCaches.getInfo(method))
121+
val jsMethodProps = {
122+
classDef.jsConstructor.map(jsConstructorInfoCache.getInfo(_)).toList :::
123+
exportedMembersInfoCaches.getInfos(classDef.jsMethodProps)
133124
}
134125

135-
classDef.jsConstructor.foreach { jsConstructor =>
136-
builder.addExportedMember(jsConstructorInfoCache.getInfo(jsConstructor))
137-
}
138-
139-
for (info <- exportedMembersInfoCaches.getInfos(classDef.jsMethodProps))
140-
builder.addExportedMember(info)
141-
142126
/* We do not cache top-level exports, because they're quite rare,
143127
* and usually quite small when they exist.
144128
*/
145-
classDef.topLevelExportDefs.foreach { topLevelExportDef =>
146-
builder.addTopLevelExport(Infos.generateTopLevelExportInfo(classDef.name.name, topLevelExportDef))
147-
}
129+
val topLevelExports = classDef.topLevelExportDefs
130+
.map(Infos.generateTopLevelExportInfo(classDef.name.name, _))
148131

149-
classDef.jsNativeMembers.foreach(builder.addJSNativeMember(_))
132+
val jsNativeMembers = classDef.jsNativeMembers
133+
.map(m => m.name.name -> m.jsNativeLoadSpec).toMap
150134

151-
builder.result()
135+
new Infos.ClassInfo(classDef.className, classDef.kind,
136+
classDef.superClass.map(_.name), classDef.interfaces.map(_.name),
137+
classDef.jsNativeLoadSpec, referencedFieldClasses, methods, jsNativeMembers,
138+
jsMethodProps, topLevelExports)
152139
}
153140

154141
/** Returns true if the cache has been used and should be kept. */

linker/shared/src/main/scala/org/scalajs/linker/analyzer/Infos.scala

Lines changed: 18 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ object Infos {
4343
final case class NamespacedMethodName(
4444
namespace: MemberNamespace, methodName: MethodName)
4545

46-
final class ClassInfo private[Infos] (
46+
final class ClassInfo(
4747
val className: ClassName,
4848
val kind: ClassKind,
4949
val superClass: Option[ClassName], // always None for interfaces
@@ -165,57 +165,25 @@ object Infos {
165165
val methodName: MethodName
166166
) extends MemberReachabilityInfo
167167

168-
final class ClassInfoBuilder(
169-
private val className: ClassName,
170-
private val kind: ClassKind,
171-
private val superClass: Option[ClassName],
172-
private val interfaces: List[ClassName],
173-
private val jsNativeLoadSpec: Option[JSNativeLoadSpec]
< 628C /td>
174-
) {
175-
private val referencedFieldClasses = mutable.Map.empty[FieldName, ClassName]
176-
private val methods = mutable.ListBuffer.empty[MethodInfo]
177-
private val jsNativeMembers = mutable.Map.empty[MethodName, JSNativeLoadSpec]
178-
private val jsMethodProps = mutable.ListBuffer.empty[ReachabilityInfo]
179-
private val topLevelExports = mutable.ListBuffer.empty[TopLevelExportInfo]
180-
181-
def maybeAddReferencedFieldClass(name: FieldName, tpe: Type): this.type = {
182-
tpe match {
183-
case ClassType(cls) =>
184-
referencedFieldClasses.put(name, cls)
185-
case ArrayType(ArrayTypeRef(ClassRef(cls), _)) =>
186-
referencedFieldClasses.put(name, cls)
187-
case _ =>
188-
}
189-
190-
this
191-
}
192-
193-
def addMethod(methodInfo: MethodInfo): this.type = {
194-
methods += methodInfo
195-
this
196-
}
197-
198-
def addJSNativeMember(member: JSNativeMemberDef): this.type = {
199-
jsNativeMembers.put(member.name.name, member.jsNativeLoadSpec)
200-
this
201-
}
202-
203-
def addExportedMember(reachabilityInfo: ReachabilityInfo): this.type = {
204-
jsMethodProps += reachabilityInfo
205-
this
206-
}
207-
208-
def addTopLevelExport(topLevelExportInfo: TopLevelExportInfo): this.type = {
209-
topLevelExports += topLevelExportInfo
210-
this
168+
def genReferencedFieldClasses(fields: List[AnyFieldDef]): Map[FieldName, ClassName] = {
169+
val builder = Map.newBuilder[FieldName, ClassName]
170+
171+
fields.foreach {
172+
case FieldDef(flags, FieldIdent(name), _, ftpe) =>
173+
if (!flags.namespace.isStatic) {
174+
ftpe match {
175+
case ClassType(cls) =>
176+
builder += name -> cls
177+
case ArrayType(ArrayTypeRef(ClassRef(cls), _)) =>
178+
builder += name -> cls
179+
case _ =>
180+
}
181+
}
182+
case _: JSFieldDef =>
183+
// Nothing to do.
211184
}
212185

213-
def result(): ClassInfo = {
214-
new ClassInfo(className, kind, superClass,
215-
interfaces, jsNativeLoadSpec, referencedFieldClasses.toMap,
216-
methods.toList, jsNativeMembers.toMap, jsMethodProps.toList,
217-
topLevelExports.toList)
218-
}
186+
builder.result()
219187
}
220188

221189
final class ReachabilityInfoBuilder {

0 commit comments

Comments
 (0)
0