/
CompilationUnits.scala
124 lines (94 loc) · 3.74 KB
/
CompilationUnits.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/* NSC -- new Scala compiler
* Copyright 2005-2011 LAMP/EPFL
* @author Martin Odersky
*/
package scala.tools.nsc
import util.FreshNameCreator
import scala.reflect.internal.util.{ Position, NoPosition, BatchSourceFile, SourceFile, NoSourceFile }
import scala.collection.mutable
import scala.collection.mutable.{ LinkedHashSet, ListBuffer }
trait CompilationUnits { self: Global =>
/** An object representing a missing compilation unit.
*/
object NoCompilationUnit extends CompilationUnit(NoSourceFile) {
override lazy val isJava = false
override def exists = false
override def toString() = "NoCompilationUnit"
}
/** One unit of compilation that has been submitted to the compiler.
* It typically corresponds to a single file of source code. It includes
* error-reporting hooks. */
class CompilationUnit(val source: SourceFile) {
/** the fresh name creator */
var fresh: FreshNameCreator = new FreshNameCreator.Default
def freshTermName(prefix: String): TermName = newTermName(fresh.newName(prefix))
def freshTypeName(prefix: String): TypeName = newTypeName(fresh.newName(prefix))
/** the content of the compilation unit in tree form */
var body: Tree = EmptyTree
def exists = source != NoSourceFile && source != null
// def parseSettings() = {
// val argsmarker = "SCALAC_ARGS"
// if(comments nonEmpty) {
// val pragmas = comments find (_.text.startsWith("//#")) // only parse first one
// pragmas foreach { p =>
// val i = p.text.indexOf(argsmarker)
// if(i > 0)
// }
// }
// }
/** Note: depends now contains toplevel classes.
* To get their sourcefiles, you need to dereference with .sourcefile
*/
val depends = mutable.HashSet[Symbol]()
/** so we can relink
*/
val defined = mutable.HashSet[Symbol]()
/** Synthetic definitions generated by namer, eliminated by typer.
*/
val synthetics = mutable.HashMap[Symbol, Tree]()
/** things to check at end of compilation unit */
val toCheck = new ListBuffer[() => Unit]
/** The features that were already checked for this unit */
var checkedFeatures = Set[Symbol]()
def position(pos: Int) = source.position(pos)
/** The position of a targeted type check
* If this is different from NoPosition, the type checking
* will stop once a tree that contains this position range
* is fully attributed.
*/
def targetPos: Position = NoPosition
/** The icode representation of classes in this compilation unit.
* It is empty up to phase 'icode'.
*/
val icode: LinkedHashSet[icodes.IClass] = new LinkedHashSet
def echo(pos: Position, msg: String) =
reporter.echo(pos, msg)
def error(pos: Position, msg: String) =
reporter.error(pos, msg)
def warning(pos: Position, msg: String) =
reporter.warning(pos, msg)
def deprecationWarning(pos: Position, msg: String) =
currentRun.deprecationWarnings0.warn(pos, msg)
def uncheckedWarning(pos: Position, msg: String) =
currentRun.uncheckedWarnings0.warn(pos, msg)
def inlinerWarning(pos: Position, msg: String) =
currentRun.inlinerWarnings.warn(pos, msg)
def incompleteInputError(pos: Position, msg:String) =
reporter.incompleteInputError(pos, msg)
def comment(pos: Position, msg: String) =
reporter.comment(pos, msg)
/** Is this about a .java source file? */
lazy val isJava = source.file.name.endsWith(".java")
override def toString() = source.toString()
def clear() {
fresh = new FreshNameCreator.Default
body = EmptyTree
depends.clear()
defined.clear()
synthetics.clear()
toCheck.clear()
checkedFeatures = Set()
icode.clear()
}
}
}