@@ -36,7 +36,12 @@ object ScriptSourceFile {
36
36
37
37
class SourceFile (val file : AbstractFile , computeContent : => Array [Char ]) extends interfaces.SourceFile {
38
38
39
- lazy val content = computeContent
39
+ private var myContent : Array [Char ] = null
40
+
41
+ def content (): Array [Char ] = {
42
+ if (myContent == null ) myContent = computeContent
43
+ myContent
44
+ }
40
45
41
46
def this (file : AbstractFile , codec : Codec ) = this (file, new String (file.toByteArray, codec.charSet).toCharArray)
42
47
def this (name : String , content : String ) = this (new VirtualFile (name, content.getBytes), scala.io.Codec .UTF8 )
@@ -54,9 +59,9 @@ class SourceFile(val file: AbstractFile, computeContent: => Array[Char]) extends
54
59
}
55
60
override def hashCode : Int = file.path.## + start.##
56
61
57
- def apply (idx : Int ): Char = content.apply(idx)
62
+ def apply (idx : Int ): Char = content() .apply(idx)
58
63
59
- val length : Int = content.length
64
+ val length : Int = content() .length
60
65
61
66
/** true for all source files except `NoSource` */
62
67
def exists : Boolean = true
@@ -81,9 +86,9 @@ class SourceFile(val file: AbstractFile, computeContent: => Array[Char]) extends
81
86
82
87
private def isLineBreak (idx : Int ) =
83
88
if (idx >= length) false else {
84
- val ch = content(idx)
89
+ val ch = content()( idx)
85
90
// don't identify the CR in CR LF as a line break, since LF will do.
86
- if (ch == CR ) (idx + 1 == length) || (content(idx + 1 ) != LF )
91
+ if (ch == CR ) (idx + 1 == length) || (content()( idx + 1 ) != LF )
87
92
else isLineBreakChar(ch)
88
93
}
89
94
@@ -94,7 +99,7 @@ class SourceFile(val file: AbstractFile, computeContent: => Array[Char]) extends
94
99
buf += cs.length // sentinel, so that findLine below works smoother
95
100
buf.toArray
96
101
}
97
- private lazy val lineIndices : Array [Int ] = calculateLineIndices(content)
102
+ private lazy val lineIndices : Array [Int ] = calculateLineIndices(content() )
98
103
99
104
/** Map line to offset of first character in line */
100
105
def lineToOffset (index : Int ): Int = lineIndices(index)
@@ -130,7 +135,7 @@ class SourceFile(val file: AbstractFile, computeContent: => Array[Char]) extends
130
135
var idx = startOfLine(offset)
131
136
var col = 0
132
137
while (idx != offset) {
133
- col += (if (idx < length && content(idx) == '\t ' ) (tabInc - col) % tabInc else 1 )
138
+ col += (if (idx < length && content()( idx) == '\t ' ) (tabInc - col) % tabInc else 1 )
134
139
idx += 1
135
140
}
136
141
col
@@ -141,7 +146,7 @@ class SourceFile(val file: AbstractFile, computeContent: => Array[Char]) extends
141
146
var idx = startOfLine(offset)
142
147
val pad = new StringBuilder
143
148
while (idx != offset) {
144
- pad.append(if (idx < length && content(idx) == '\t ' ) '\t ' else ' ' )
149
+ pad.append(if (idx < length && content()( idx) == '\t ' ) '\t ' else ' ' )
145
150
idx += 1
146
151
}
147
152
pad.result()
0 commit comments