1
1
package scala .tools .nsc
2
2
3
+ import java .io .{File , OutputStreamWriter }
4
+ import java .nio .charset .Charset
3
5
import java .nio .file .attribute .BasicFileAttributes
4
6
import java .nio .file .{FileVisitResult , Files , Path , SimpleFileVisitor }
5
7
import java .util
6
8
9
+ import javax .tools .ToolProvider
7
10
import org .junit .Test
8
11
9
- import scala .collection .JavaConverters .asScalaIteratorConverter
12
+ import scala .collection .JavaConverters .{ asScalaIteratorConverter , seqAsJavaListConverter }
10
13
import scala .language .implicitConversions
11
14
import scala .reflect .internal .util .{BatchSourceFile , SourceFile }
12
15
import scala .reflect .io .PlainNioFile
@@ -187,6 +190,48 @@ class DeterminismTest {
187
190
test(List (code))
188
191
}
189
192
193
+ @ Test def testAnnotations1 (): Unit = {
194
+ def code = List [SourceFile ](
195
+ source(" a.scala" ,
196
+ """
197
+ |class Annot1(s: String) extends scala.annotation.StaticAnnotation
198
+ |class Annot2(s: Class[_]) extends scala.annotation.StaticAnnotation
199
+ |
200
+ """ .stripMargin),
201
+ source(" b.scala" ,
202
+ """
203
+ |@Annot1("foo")
204
+ |@Annot2(classOf[AnyRef])
205
+ |class Test
206
+ """ .stripMargin)
207
+ )
208
+ test(List (code))
209
+ }
210
+
211
+ @ Test def testAnnotationsJava (): Unit = {
212
+ def code = List [SourceFile ](
213
+ source(" Annot1.java" ,
214
+ """
215
+ |import java.lang.annotation.*;
216
+ |@Retention(RetentionPolicy.RUNTIME)
217
+ |@Target(ElementType.TYPE)
218
+ |@Inherited
219
+ |@interface Annot1 { String value() default ""; }
220
+ |
221
+ |@Retention(RetentionPolicy.RUNTIME)
222
+ |@Target(ElementType.TYPE)
223
+ |@Inherited
224
+ |@interface Annot2 { Class value(); }
225
+ |
226
+ """ .stripMargin),
227
+ source(" b.scala" ,
228
+ """
229
+ |@Annot1("foo") @Annot2(classOf[AnyRef]) class Test
230
+ """ .stripMargin)
231
+ )
232
+ test(List (code))
233
+ }
234
+
190
235
def source (name : String , code : String ): SourceFile = new BatchSourceFile (name, code)
191
236
private def test (groups : List [List [SourceFile ]]): Unit = {
192
237
val referenceOutput = Files .createTempDirectory(" reference" )
@@ -203,6 +248,21 @@ class DeterminismTest {
203
248
// println("scalac " + files.mkString(" "))
204
249
r.compileSources(files)
205
250
assert(! storeReporter.hasErrors, storeReporter.infos.mkString(" \n " ))
251
+ files.filter(_.file.name.endsWith(" .java" )) match {
252
+ case Nil =>
253
+ case javaSources =>
254
+ def tempFileFor (s : SourceFile ): Path = {
255
+ val f = output.resolve(s.file.name)
256
+ Files .write(f, new String (s.content).getBytes(Charset .defaultCharset()))
257
+ }
258
+ val options = List (" -d" , output.toString)
259
+ val javac = ToolProvider .getSystemJavaCompiler
260
+ val fileMan = javac.getStandardFileManager(null , null , null )
261
+ val javaFileObjects = fileMan.getJavaFileObjects(javaSources.map(s => tempFileFor(s).toAbsolutePath.toString): _* )
262
+ val task = javac.getTask(new OutputStreamWriter (System .out), fileMan, null , options.asJava, Nil .asJava, javaFileObjects)
263
+ val result = task.call()
264
+ assert(result)
265
+ }
206
266
}
207
267
208
268
for (group <- groups.init) {
0 commit comments