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 }
13
+ import scala .collection .immutable
10
14
import scala .language .implicitConversions
11
15
import scala .reflect .internal .util .{BatchSourceFile , SourceFile }
12
16
import scala .reflect .io .PlainNioFile
@@ -187,6 +191,78 @@ class DeterminismTest {
187
191
test(List (code))
188
192
}
189
193
194
+ @ Test def testAnnotations1 (): Unit = {
195
+ def code = List [SourceFile ](
196
+ source(" a.scala" ,
197
+ """
198
+ |class Annot1(s: String) extends scala.annotation.StaticAnnotation
199
+ |class Annot2(s: Class[_]) extends scala.annotation.StaticAnnotation
200
+ |
201
+ """ .stripMargin),
202
+ source(" b.scala" ,
203
+ """
204
+ |@Annot1("foo")
205
+ |@Annot2(classOf[AnyRef])
206
+ |class Test
207
+ """ .stripMargin)
208
+ )
209
+ test(List (code))
210
+ }
211
+
212
+ @ Test def testAnnotationsJava (): Unit = {
213
+ def code = List [SourceFile ](
214
+ source(" Annot1.java" ,
215
+ """
216
+ |import java.lang.annotation.*;
217
+ |@Retention(RetentionPolicy.RUNTIME)
218
+ |@Target(ElementType.TYPE)
219
+ |@Inherited
220
+ |@interface Annot1 { String value() default ""; }
221
+ |
222
+ |@Retention(RetentionPolicy.RUNTIME)
223
+ |@Target(ElementType.TYPE)
224
+ |@Inherited
225
+ |@interface Annot2 { Class value(); }
226
+ |
227
+ """ .stripMargin),
228
+ source(" b.scala" ,
229
+ """
230
+ |@Annot1("foo") @Annot2(classOf[AnyRef]) class Test
231
+ """ .stripMargin)
232
+ )
233
+ test(List (code))
234
+ }
235
+
236
+ @ Test def testAnnotationsJavaRepeatable (): Unit = {
237
+ val javaAnnots = source(" Annot1.java" ,
238
+ """
239
+ |import java.lang.annotation.*;
240
+ |@Repeatable(Annot1.Container.class)
241
+ |@Retention(RetentionPolicy.RUNTIME)
242
+ |@Target(ElementType.TYPE)
243
+ |@interface Annot1 { String value() default "";
244
+ |
245
+ | @Retention(RetentionPolicy.RUNTIME)
246
+ | @Target(ElementType.TYPE)
247
+ | public static @interface Container {
248
+ | Annot1[] value();
249
+ | }
250
+ |}
251
+ |
252
+ |@Retention(RetentionPolicy.RUNTIME)
253
+ |@Target(ElementType.TYPE)
254
+ |@Inherited
255
+ |@interface Annot2 { Class value(); }
256
+ """ .stripMargin)
257
+ def code =
258
+ List (source(" dummy.scala" , " " ), source(" b.scala" ,
259
+ """
260
+ |@Annot1("foo") @Annot2(classOf[String]) @Annot1("bar") class Test
261
+ """ .stripMargin)
262
+ )
263
+ test(List (javaAnnots) :: code :: Nil )
264
+ }
265
+
190
266
def source (name : String , code : String ): SourceFile = new BatchSourceFile (name, code)
191
267
private def test (groups : List [List [SourceFile ]]): Unit = {
192
268
val referenceOutput = Files .createTempDirectory(" reference" )
@@ -202,7 +278,22 @@ class DeterminismTest {
202
278
val r = new Run
203
279
// println("scalac " + files.mkString(" "))
204
280
r.compileSources(files)
205
- assert(! storeReporter.hasErrors, storeReporter.infos.mkString(" \n " ))
281
+ Predef .assert(! storeReporter.hasErrors, storeReporter.infos.mkString(" \n " ))
282
+ files.filter(_.file.name.endsWith(" .java" )) match {
283
+ case Nil =>
284
+ case javaSources =>
285
+ def tempFileFor (s : SourceFile ): Path = {
286
+ val f = output.resolve(s.file.name)
287
+ Files .write(f, new String (s.content).getBytes(Charset .defaultCharset()))
288
+ }
289
+ val options = List (" -d" , output.toString)
290
+ val javac = ToolProvider .getSystemJavaCompiler
291
+ val fileMan = javac.getStandardFileManager(null , null , null )
292
+ val javaFileObjects = fileMan.getJavaFileObjects(javaSources.map(s => tempFileFor(s).toAbsolutePath.toString): _* )
293
+ val task = javac.getTask(new OutputStreamWriter (System .out), fileMan, null , options.asJava, Nil .asJava, javaFileObjects)
294
+ val result = task.call()
295
+ Predef .assert(result)
296
+ }
206
297
}
207
298
208
299
for (group <- groups.init) {
0 commit comments