Skip to content
Snippets Groups Projects
Commit dd3491bd authored by Chrissi's avatar Chrissi
Browse files

Remove error in used types and necessary imports

parent 8e33abd8
No related branches found
No related tags found
No related merge requests found
...@@ -100,7 +100,18 @@ class SClass(_name: String, ...@@ -100,7 +100,18 @@ class SClass(_name: String,
} }
/** Gets the parents of `this` class. */ /** Gets the parents of `this` class. */
def getAllParents(): Seq[STypedElement] = parentInterfaces :+ parentClass def getAllParents(): Seq[STypedElement] = {
if (parentInterfaces.isEmpty && parentClass == null) {
return Seq.empty
}
if (parentInterfaces.isEmpty) {
return Seq(parentClass)
}
if (parentClass == null) {
return parentInterfaces
}
parentInterfaces :+ parentClass
}
/** Makes `this` class a subclass of `parent`. /** Makes `this` class a subclass of `parent`.
* *
...@@ -183,18 +194,24 @@ class SClass(_name: String, ...@@ -183,18 +194,24 @@ class SClass(_name: String,
/** Provides all types `this` classes accesses in some way. */ /** Provides all types `this` classes accesses in some way. */
def getUsedTypes: Set[STypedElement] = { def getUsedTypes: Set[STypedElement] = {
println(this + " Parents: " + getAllParents) //println(this + " Parents: " + getAllParents)
val parentImport: Seq[STypedElement] = getAllParents() //TODO: weiß nicht ob null mit in der liste steht val parentImport: Seq[STypedElement] = getAllParents()
val parentConstructorParamImports: Seq[STypedElement] = if (isRootClass) List() else getClassParent match { val parentConstructorParamImports: Seq[STypedElement] = if (isRootClass) List() else getClassParent match {
case parent: SClass => parent.getStructuralFeatures.map(_.sType) case parent: SClass =>
println(parent.getDeepStructuralFeatures)
println(parent.getDeepStructuralFeatures.map(_.sType))
parent.getDeepStructuralFeatures.map(_.sType)
case _ => List() case _ => List()
} }
//attribute types
val attrTypeImports: Seq[STypedElement] = attributes.map(_.sType) val attrTypeImports: Seq[STypedElement] = attributes.map(_.sType)
//reference types
val refTypeImports: Seq[STypedElement] = references.map(_.sType) val refTypeImports: Seq[STypedElement] = references.map(_.sType)
//method types
val methodResultImports: Seq[STypedElement] = methods.map(_.result) val methodResultImports: Seq[STypedElement] = methods.map(_.result)
val methodParamImports: Seq[STypedElement] = methods.flatMap(_.params).map(_.paramType) val methodParamImports: Seq[STypedElement] = methods.flatMap(_.params).map(_.paramType)
...@@ -220,54 +237,48 @@ class SClass(_name: String, ...@@ -220,54 +237,48 @@ class SClass(_name: String,
override def getInheritanceHierarchy: Seq[STypedElement] = if (isRootClass) List(this) else this +: getClassParent.getInheritanceHierarchy override def getInheritanceHierarchy: Seq[STypedElement] = if (isRootClass) List(this) else this +: getClassParent.getInheritanceHierarchy
override def getNecessaryImports: Set[SImport] = { override def getNecessaryImports: Set[SImport] = {
val parentImport: List[SImport] = if (isRootClass) List() else includeImportIfNecessary(getClassParent.getPackage, getClassParent.getName) var allImports: List[SImport] = List.empty
//iterate over all parent types
val parentConstructorParamImports: List[SImport] = if (isRootClass) List() else getClassParent match { getAllParents().foreach(p => {
allImports = includeImportIfNecessary(p.sPackage, p.name, allImports)
})
//iterate over construction features of parent types
if (!isRootClass) {
getClassParent match {
case parent: SClass => case parent: SClass =>
parent.attributes parent.getStructuralFeatures.foreach(p => {
.map(attr => includeImportIfNecessary(attr.sType.getPackage, attr.sType.getName)) allImports = includeImportIfNecessary(p.sType.getPackage, p.getType, allImports)
.fold(List())((l1, l2) => l1 ++ l2) })
case _ => List() case _ => List()
} }
}
val attrTypeImports: List[SImport] = //iterate over all attributes
attributes attributes.foreach(a => {
.map(attr => includeImportIfNecessary(attr.sType.getPackage, attr.getType)) allImports = includeImportIfNecessary(a.sType.getPackage, a.getType, allImports)
.fold(List())((l1, l2) => l1 ++ l2) })
val refTypeImports: List[SImport] =
references
.map(attr => includeImportIfNecessary(attr.sType.getPackage, attr.getType))
.fold(List())((l1, l2) => l1 ++ l2)
val methodResultImports: List[SImport] =
methods
.map(_.result)
.map(res => includeImportIfNecessary(res.getPackage, res.getName))
.fold(List())((l1, l2) => l1 ++ l2)
val methodParamImports: List[SImport] = //iterate over all references
methods references.foreach(r => {
.map(_.params) allImports = includeImportIfNecessary(r.sType.getPackage, r.getType, allImports)
.fold(List())((l1, l2) => l1 ++ l2) })
.map(param => includeImportIfNecessary(param.paramType.getPackage, param.paramType.getName))
.fold(List())((l1, l2) => l1 ++ l2)
val methodImplImports: List[SImport] = methods.foreach(m => {
methods //iterate over result types
.map(_.getUsedTypes.toList) allImports = includeImportIfNecessary(m.result.getPackage, m.result.getName, allImports)
.fold(List())((l1, l2) => l1 ++ l2) //iterate over parameter types
.map(typ => includeImportIfNecessary(typ.getPackage, typ.getName)) m.params.foreach(p => {
.fold(List())((l1, l2) => l1 ++ l2) allImports = includeImportIfNecessary(p.paramType.getPackage, p.paramType.getName, allImports)
})
//iterate over used types in the method
m.getUsedTypes.foreach(t => {
allImports = includeImportIfNecessary(t.getPackage, t.getName, allImports)
})
})
// create a set to eliminate duplicates // create a set to eliminate duplicates
(parentImport (allImports).toSet
++ parentConstructorParamImports
++ attrTypeImports
++ refTypeImports
++ methodResultImports
++ methodParamImports
++ methodImplImports).toSet
} }
override def accept(visitor: SModelVisitor): Unit = { override def accept(visitor: SModelVisitor): Unit = {
...@@ -287,8 +298,8 @@ class SClass(_name: String, ...@@ -287,8 +298,8 @@ class SClass(_name: String,
* @return an empty list if the class does not need to be imported, or the necessary import * @return an empty list if the class does not need to be imported, or the necessary import
* otherwise * otherwise
*/ */
private def includeImportIfNecessary(sPackage: String, sClass: String): List[SImport] = { private def includeImportIfNecessary(sPackage: String, sClass: String, list: List[SImport]): List[SImport] = {
if (sPackage != this.sPackage && sPackage != "") List(SImport(sPackage, sClass)) else List() if (sPackage != this.sPackage && sPackage != "") list :+ SImport(sPackage, sClass) else list
} }
override def equals(other: Any): Boolean = other match { override def equals(other: Any): Boolean = other match {
...@@ -304,6 +315,6 @@ class SClass(_name: String, ...@@ -304,6 +315,6 @@ class SClass(_name: String,
state.map(_.hashCode()).foldLeft(0)((a, b) => 31 * a + b) state.map(_.hashCode()).foldLeft(0)((a, b) => 31 * a + b)
} }
override def toString: String = s"$name(${attributes.map(_.name).mkString(", ")}) A: $isAbstract I: $isInterface" override def toString: String = s"SC: $name(${attributes.map(_.name).mkString(", ")}, $isAbstract, $isInterface)"
} }
...@@ -14,6 +14,8 @@ package org.rosi_project.model_sync.generator.acr_model ...@@ -14,6 +14,8 @@ package org.rosi_project.model_sync.generator.acr_model
case class SType(_name: String, _sPackage: String = "", _isInterface: Boolean = true) extends STypedElement (_name, _sPackage, _isInterface) { case class SType(_name: String, _sPackage: String = "", _isInterface: Boolean = true) extends STypedElement (_name, _sPackage, _isInterface) {
override def accept(visitor: SModelVisitor): Unit = visitor.visit(this) override def accept(visitor: SModelVisitor): Unit = visitor.visit(this)
override def toString: String = s"ST: $name($sPackage, $isInterface)"
} }
/** The companion defines frequently used types. /** The companion defines frequently used types.
......
...@@ -14,8 +14,7 @@ abstract class STypedElement (_name: String, ...@@ -14,8 +14,7 @@ abstract class STypedElement (_name: String,
val sPackage: String, val sPackage: String,
var isInterface: Boolean) extends SNamedModelElement(_name) { var isInterface: Boolean) extends SNamedModelElement(_name) {
/** Checks, whether `this` is part of the default package /** Checks, whether `this` is part of the default package */
*/
def isDefaultPackage: Boolean = sPackage == "" def isDefaultPackage: Boolean = sPackage == ""
/** The package containing `this` type. /** The package containing `this` type.
...@@ -24,8 +23,7 @@ abstract class STypedElement (_name: String, ...@@ -24,8 +23,7 @@ abstract class STypedElement (_name: String,
*/ */
def getPackage: String = sPackage def getPackage: String = sPackage
/** The parameters necessary to create an instance of `this` type. /** The parameters necessary to create an instance of `this` type. */
*/
def getConstructorParameters: Seq[SMethodParameter] = Seq.empty def getConstructorParameters: Seq[SMethodParameter] = Seq.empty
/** The inheritance hierarchy provides information about the types `this` extends. It will start /** The inheritance hierarchy provides information about the types `this` extends. It will start
...@@ -38,4 +36,6 @@ abstract class STypedElement (_name: String, ...@@ -38,4 +36,6 @@ abstract class STypedElement (_name: String,
*/ */
def getNecessaryImports: Set[SImport] = Set.empty def getNecessaryImports: Set[SImport] = Set.empty
override def toString: String = s"STE: $name($sPackage, $isInterface)"
} }
...@@ -8,6 +8,7 @@ class SList(elemType: STypedElement) extends SSeq(elemType) { ...@@ -8,6 +8,7 @@ class SList(elemType: STypedElement) extends SSeq(elemType) {
override def getConstructorParameters: Seq[SMethodParameter] = Seq(SMethodParameter("elems", elemType)) override def getConstructorParameters: Seq[SMethodParameter] = Seq(SMethodParameter("elems", elemType))
override def toString: String = s"List: $elemType"
} }
/** The companion provides `apply` and `unapply` methods. /** The companion provides `apply` and `unapply` methods.
......
...@@ -8,6 +8,7 @@ class SSeq(val elemType: STypedElement) extends GenericSType(name = "Seq", sPack ...@@ -8,6 +8,7 @@ class SSeq(val elemType: STypedElement) extends GenericSType(name = "Seq", sPack
override def getConstructorParameters: Seq[SMethodParameter] = Seq(SMethodParameter("elems", elemType)) override def getConstructorParameters: Seq[SMethodParameter] = Seq(SMethodParameter("elems", elemType))
override def toString: String = s"Seq: $elemType"
} }
/** The companion provides `apply` and `unapply` methods. /** The companion provides `apply` and `unapply` methods.
......
...@@ -99,11 +99,11 @@ class SClassWriter(val modelClass: SClass) { ...@@ -99,11 +99,11 @@ class SClassWriter(val modelClass: SClass) {
val constructor: String = s"(${params.mkString(", ")})" val constructor: String = s"(${params.mkString(", ")})"
println("params: " + params) /*println("params: " + params)
println("parentConstructorParams: " + parentConstructorParams) println("parentConstructorParams: " + parentConstructorParams)
println("parentConstructor: " + parentConstructor) println("parentConstructor: " + parentConstructor)
println("allInterfaces: " + allInterfaces) println("allInterfaces: " + allInterfaces)
println("constructor: " + constructor) println("constructor: " + constructor)*/
if (modelClass.isInterface) { if (modelClass.isInterface) {
baseFixture = s"trait ${modelClass.getName}" baseFixture = s"trait ${modelClass.getName}"
......
...@@ -40,7 +40,16 @@ class ConstructorTemplate(modelClass: SClass) extends SClass(_name = s"${modelCl ...@@ -40,7 +40,16 @@ class ConstructorTemplate(modelClass: SClass) extends SClass(_name = s"${modelCl
) )
) )
override def getNecessaryImports: Set[SImport] = modelClass.getUsedTypes.filter(_.getPackage != "").map(elem => SImport(elem.getPackage, elem.getName)) ++ super.getNecessaryImports + SImport(modelClass.getPackage, modelClass.getName) override def getNecessaryImports: Set[SImport] = {
println("+++++++++++++++++++++++++")
println(modelClass.getUsedTypes.filter(_.getPackage != "").map(elem => SImport(elem.getPackage, elem.getName)))
println(super.getNecessaryImports)
println(SImport(modelClass.getPackage, modelClass.getName))
println("+++++++++++++++++++++++++")
(modelClass.getUsedTypes.filter(_.getPackage != "").map(elem => SImport(elem.getPackage, elem.getName))
++ super.getNecessaryImports
+ SImport(modelClass.getPackage, modelClass.getName))
}
private def generateConstructorParams: String = { private def generateConstructorParams: String = {
modelClass.getDeepStructuralFeatures.map(attr => s"classOf[${attr.getType}]").mkString(", ") modelClass.getDeepStructuralFeatures.map(attr => s"classOf[${attr.getType}]").mkString(", ")
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment