2010-10-23 03:55:16 +02:00
|
|
|
/* sbt -- Simple Build Tool
|
|
|
|
|
* Copyright 2010 Mark Harrah
|
|
|
|
|
*/
|
|
|
|
|
package xsbt.api
|
|
|
|
|
|
|
|
|
|
import xsbti.api._
|
|
|
|
|
import scala.collection.mutable
|
|
|
|
|
|
|
|
|
|
class Visit
|
|
|
|
|
{
|
|
|
|
|
private[this] val visitedStructures = new mutable.HashSet[Structure]
|
|
|
|
|
private[this] val visitedClassLike = new mutable.HashSet[ClassLike]
|
|
|
|
|
|
|
|
|
|
def visit(s: Source): Unit =
|
2010-10-30 23:52:18 +02:00
|
|
|
{
|
|
|
|
|
s.packages foreach visitPackage
|
2010-10-23 03:55:16 +02:00
|
|
|
s.definitions foreach visitDefinition
|
2010-10-30 23:52:18 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
def visitPackage(p: Package)
|
|
|
|
|
{
|
|
|
|
|
visitString(p.name)
|
|
|
|
|
}
|
2010-10-23 03:55:16 +02:00
|
|
|
|
|
|
|
|
def visitDefinitions(ds: Seq[Definition]) = ds foreach visitDefinition
|
|
|
|
|
def visitDefinition(d: Definition)
|
|
|
|
|
{
|
2010-10-30 23:52:18 +02:00
|
|
|
visitString(d.name)
|
|
|
|
|
visitAnnotations(d.annotations)
|
|
|
|
|
visitModifiers(d.modifiers)
|
|
|
|
|
visitAccess(d.access)
|
2010-10-23 03:55:16 +02:00
|
|
|
d match
|
|
|
|
|
{
|
|
|
|
|
case c: ClassLike => visitClass(c)
|
|
|
|
|
case f: FieldLike => visitField(f)
|
|
|
|
|
case d: Def => visitDef(d)
|
|
|
|
|
case t: TypeDeclaration => visitTypeDeclaration(t)
|
|
|
|
|
case t: TypeAlias => visitTypeAlias(t)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
final def visitClass(c: ClassLike): Unit = if(visitedClassLike add c) visitClass0(c)
|
|
|
|
|
def visitClass0(c: ClassLike)
|
|
|
|
|
{
|
|
|
|
|
visitParameterizedDefinition(c)
|
|
|
|
|
visitType(c.selfType)
|
|
|
|
|
visitStructure(c.structure)
|
|
|
|
|
}
|
|
|
|
|
def visitField(f: FieldLike)
|
|
|
|
|
{
|
|
|
|
|
visitType(f.tpe)
|
2010-10-30 23:52:18 +02:00
|
|
|
f match
|
|
|
|
|
{
|
|
|
|
|
case v: Var => visitVar(v)
|
|
|
|
|
case v: Val => visitVal(v)
|
|
|
|
|
}
|
2010-10-23 03:55:16 +02:00
|
|
|
}
|
2010-10-30 23:52:18 +02:00
|
|
|
def visitVar(v: Var) {}
|
|
|
|
|
def visitVal(v: Val) {}
|
2010-10-23 03:55:16 +02:00
|
|
|
def visitDef(d: Def)
|
|
|
|
|
{
|
|
|
|
|
visitParameterizedDefinition(d)
|
|
|
|
|
visitValueParameters(d.valueParameters)
|
|
|
|
|
visitType(d.returnType)
|
|
|
|
|
}
|
2010-10-30 23:52:18 +02:00
|
|
|
def visitAccess(a: Access): Unit =
|
|
|
|
|
a match
|
|
|
|
|
{
|
|
|
|
|
case pub: Public => visitPublic(pub)
|
|
|
|
|
case qual: Qualified => visitQualified(qual)
|
|
|
|
|
}
|
|
|
|
|
def visitQualified(qual: Qualified): Unit =
|
|
|
|
|
qual match
|
|
|
|
|
{
|
|
|
|
|
case p: Protected => visitProtected(p)
|
|
|
|
|
case p: Private => visitPrivate(p)
|
|
|
|
|
}
|
|
|
|
|
def visitQualifier(qual: Qualifier): Unit =
|
|
|
|
|
qual match
|
|
|
|
|
{
|
|
|
|
|
case unq: Unqualified => visitUnqualified(unq)
|
|
|
|
|
case thisq: ThisQualifier => visitThisQualifier(thisq)
|
|
|
|
|
case id: IdQualifier => visitIdQualifier(id)
|
|
|
|
|
}
|
|
|
|
|
def visitIdQualifier(id: IdQualifier)
|
|
|
|
|
{
|
|
|
|
|
visitString(id.value)
|
|
|
|
|
}
|
|
|
|
|
def visitUnqualified(unq: Unqualified) {}
|
|
|
|
|
def visitThisQualifier(thisq: ThisQualifier) {}
|
|
|
|
|
def visitPublic(pub: Public) {}
|
|
|
|
|
def visitPrivate(p: Private) { visitQualifier(p.qualifier) }
|
|
|
|
|
def visitProtected(p: Protected) { visitQualifier(p.qualifier) }
|
|
|
|
|
def visitModifiers(m: Modifiers) {}
|
|
|
|
|
|
2010-10-23 03:55:16 +02:00
|
|
|
def visitValueParameters(valueParameters: Seq[ParameterList]) = valueParameters foreach visitValueParameterList
|
|
|
|
|
def visitValueParameterList(list: ParameterList) = list.parameters foreach visitValueParameter
|
2010-10-30 23:52:18 +02:00
|
|
|
def visitValueParameter(parameter: MethodParameter) =
|
|
|
|
|
{
|
|
|
|
|
visitString(parameter.name)
|
|
|
|
|
visitType(parameter.tpe)
|
|
|
|
|
}
|
2010-10-23 03:55:16 +02:00
|
|
|
|
|
|
|
|
def visitParameterizedDefinition[T <: ParameterizedDefinition](d: T)
|
|
|
|
|
{
|
|
|
|
|
visitTypeParameters(d.typeParameters)
|
|
|
|
|
}
|
|
|
|
|
def visitTypeDeclaration(d: TypeDeclaration)
|
|
|
|
|
{
|
|
|
|
|
visitParameterizedDefinition(d)
|
|
|
|
|
visitType(d.lowerBound)
|
|
|
|
|
visitType(d.upperBound)
|
|
|
|
|
}
|
|
|
|
|
def visitTypeAlias(d: TypeAlias)
|
|
|
|
|
{
|
|
|
|
|
visitParameterizedDefinition(d)
|
|
|
|
|
visitType(d.tpe)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
def visitTypeParameters(parameters: Seq[TypeParameter]) = parameters foreach visitTypeParameter
|
|
|
|
|
def visitTypeParameter(parameter: TypeParameter)
|
|
|
|
|
{
|
|
|
|
|
visitTypeParameters(parameter.typeParameters)
|
|
|
|
|
visitType(parameter.lowerBound)
|
|
|
|
|
visitType(parameter.upperBound)
|
2010-10-30 23:52:18 +02:00
|
|
|
visitAnnotations(parameter.annotations)
|
2010-10-23 03:55:16 +02:00
|
|
|
}
|
|
|
|
|
def visitAnnotations(annotations: Seq[Annotation]) = annotations foreach visitAnnotation
|
2010-10-30 23:52:18 +02:00
|
|
|
def visitAnnotation(annotation: Annotation) =
|
|
|
|
|
{
|
|
|
|
|
visitType(annotation.base)
|
|
|
|
|
visitAnnotationArguments(annotation.arguments)
|
|
|
|
|
}
|
|
|
|
|
def visitAnnotationArguments(args: Seq[AnnotationArgument]) = args foreach visitAnnotationArgument
|
|
|
|
|
def visitAnnotationArgument(arg: AnnotationArgument)
|
|
|
|
|
{
|
|
|
|
|
visitString(arg.name)
|
|
|
|
|
visitString(arg.value)
|
|
|
|
|
}
|
2010-10-23 03:55:16 +02:00
|
|
|
|
|
|
|
|
def visitTypes(ts: Seq[Type]) = ts.foreach(visitType)
|
|
|
|
|
def visitType(t: Type)
|
|
|
|
|
{
|
|
|
|
|
t match
|
|
|
|
|
{
|
|
|
|
|
case s: Structure => visitStructure(s)
|
|
|
|
|
case e: Existential => visitExistential(e)
|
|
|
|
|
case p: Polymorphic => visitPolymorphic(p)
|
|
|
|
|
case a: Annotated => visitAnnotated(a)
|
|
|
|
|
case p: Parameterized => visitParameterized(p)
|
|
|
|
|
case p: Projection => visitProjection(p)
|
|
|
|
|
case _: EmptyType => visitEmptyType()
|
|
|
|
|
case s: Singleton => visitSingleton(s)
|
|
|
|
|
case pr: ParameterRef => visitParameterRef(pr)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
def visitEmptyType() {}
|
|
|
|
|
def visitParameterRef(p: ParameterRef) {}
|
2010-10-30 23:52:18 +02:00
|
|
|
def visitSingleton(s: Singleton) { visitPath(s.path) }
|
|
|
|
|
def visitPath(path: Path) = path.components foreach visitPathComponent
|
|
|
|
|
def visitPathComponent(pc: PathComponent) = pc match
|
|
|
|
|
{
|
|
|
|
|
case t: This => visitThisPath(t)
|
|
|
|
|
case s: Super => visitSuperPath(s)
|
|
|
|
|
case id: Id => visitIdPath(id)
|
|
|
|
|
}
|
|
|
|
|
def visitThisPath(t: This) {}
|
|
|
|
|
def visitSuperPath(s: Super) { visitPath(s.qualifier) }
|
|
|
|
|
def visitIdPath(id: Id) { visitString(id.id) }
|
|
|
|
|
|
2010-10-23 03:55:16 +02:00
|
|
|
|
|
|
|
|
def visitExistential(e: Existential) = visitParameters(e.clause, e.baseType)
|
|
|
|
|
def visitPolymorphic(p: Polymorphic) = visitParameters(p.parameters, p.baseType)
|
2010-10-30 23:52:18 +02:00
|
|
|
def visitProjection(p: Projection) =
|
|
|
|
|
{
|
|
|
|
|
visitString(p.id)
|
|
|
|
|
visitType(p.prefix)
|
|
|
|
|
}
|
2010-10-23 03:55:16 +02:00
|
|
|
def visitParameterized(p: Parameterized)
|
|
|
|
|
{
|
|
|
|
|
visitType(p.baseType)
|
|
|
|
|
visitTypes(p.typeArguments)
|
|
|
|
|
}
|
|
|
|
|
def visitAnnotated(a: Annotated)
|
|
|
|
|
{
|
|
|
|
|
visitType(a.baseType)
|
|
|
|
|
visitAnnotations(a.annotations)
|
|
|
|
|
}
|
|
|
|
|
final def visitStructure(structure: Structure) = if(visitedStructures add structure) visitStructure0(structure)
|
|
|
|
|
def visitStructure0(structure: Structure)
|
|
|
|
|
{
|
|
|
|
|
visitTypes(structure.parents)
|
|
|
|
|
visitDefinitions(structure.declared)
|
|
|
|
|
visitDefinitions(structure.inherited)
|
|
|
|
|
}
|
|
|
|
|
def visitParameters(parameters: Seq[TypeParameter], base: Type): Unit =
|
|
|
|
|
{
|
|
|
|
|
visitTypeParameters(parameters)
|
|
|
|
|
visitType(base)
|
2010-10-30 23:52:18 +02:00
|
|
|
}
|
|
|
|
|
def visitString(s: String) {}
|
2010-10-23 03:55:16 +02:00
|
|
|
}
|