Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SI-4788 Respect RetentionPolicy of Java annotations #3459

Closed
wants to merge 1 commit into from

Conversation

soc
Copy link
Member

@soc soc commented Feb 3, 2014

Also closes SI-5420 and SI-5948.

@soc
Copy link
Member Author

soc commented Feb 3, 2014

Review by @retronym and @xeno-by please, especially regarding:

  • The blatant code duplication between GenASM and BCodeHelpers
  • Implementation of retentionPolicyOf ... it feels quite unreadable to me
  • We are doing duplicate work: Once in shouldEmitAnnotation (retentionPolicyOf) and again in isRuntimeVisible

Comments and opinions appreciated.
I'll also add tests shortly.

private def isRuntimeVisible(annot: AnnotationInfo) = {
annot.atp.typeSymbol.annotations
.find(annot => annot.matches(AnnotationRetentionAttr))
.exists(annotRet => annotRet.assocs.contains((TermName("value") -> LiteralAnnotArg(Constant(AnnotationRetentionPolicyRuntimeValue)))))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use nme.value.

Every call to TermName(...) has to intern, that's why we cache commonly used names. Additionally, it's good to be able to find all usages of nme.value and find spots in the compiler that use that name.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done!

@soc
Copy link
Member Author

soc commented Feb 4, 2014

@retronym Added tests.

@soc
Copy link
Member Author

soc commented Feb 4, 2014

PLS REBUILD/pr-scala@ec9b8c9

@scala-jenkins
Copy link

(kitty-note-to-self: ignore 34027767)
🐱 Roger! Rebuilding pr-scala for ec9b8c9. 🚨

annot.matches(ClassfileAnnotationClass) &&
retentionPolicyOf(annot) != AnnotationRetentionPolicySourceValue &&
annot.args.isEmpty &&
!annot.matches(DeprecatedAttr)
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@xeno-by

Oh interesting, so DeprecatedAttr is java-defined?

No, but deprecation needs to be treated differently, see http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.7.15.

Yes, the code feels like it has too many checks here, I'll investigate.

@soc
Copy link
Member Author

soc commented Feb 5, 2014

PLS REBUILD/pr-scala@4d698ca

@scala-jenkins
Copy link

(kitty-note-to-self: ignore 34145783)
🐱 Roger! Rebuilding pr-scala for 4d698ca. 🚨

@soc
Copy link
Member Author

soc commented Feb 5, 2014

For god's sake ... is stuff broken again?

@retronym
Copy link
Member

retronym commented Feb 5, 2014

[pr-scala-publish-core] $ /bin/bash -ex /tmp/hudson5487448218442024514.sh
+ [[ -d jenkins-scripts ]]
+ cd jenkins-scripts
+ git fetch https://github.com/scala/jenkins-scripts.git HEAD
error: The requested URL returned error: 403 while accessing https://github.com/scala/jenkins-scripts.git/info/refs
fatal: HTTP request failed
Build step 'Execute shell' marked bui

Looks like a connectivity problem to Github. If it persists, I'll contact the sysadmin at EPFL to see if its on their network.

PLS REBUILD ALL

@scala-jenkins
Copy link

(kitty-note-to-self: ignore 34155799)
🐱 Roger! Rebuilding pr-scala for 4d698ca. 🚨

@soc
Copy link
Member Author

soc commented Feb 6, 2014

PLS REBUILD ALL

@scala-jenkins
Copy link

(kitty-note-to-self: ignore 34279298)
🐱 Roger! Rebuilding pr-scala for 4d698ca. 🚨

@soc
Copy link
Member Author

soc commented Feb 6, 2014

Sigh FatalError: object Predef does not have a member classOf I also saw that error when working on different thiings (like macrofying classOf) ... is this some kind of initialization issue?

    [mkdir] Created dir: /localhome/jenkins/c/workspace/pr-scala-publish-core/scala/build/quick/classes/reflect
[quick.reflect] Compiling 156 files to /localhome/jenkins/c/workspace/pr-scala-publish-core/scala/build/quick/classes/reflect
[quick.reflect] error: scala.reflect.internal.FatalError: object Predef does not have a member classOf
[quick.reflect]     at scala.reflect.internal.Definitions$DefinitionsClass.scala$reflect$internal$Definitions$DefinitionsClass$$fatalMissingSymbol(Definitions.scala:1150)
[quick.reflect]     at scala.reflect.internal.Definitions$DefinitionsClass.getMember(Definitions.scala:1167)
[quick.reflect]     at scala.reflect.internal.Definitions$DefinitionsClass.getMemberMethod(Definitions.scala:1202)
[quick.reflect]     at scala.reflect.internal.Definitions$DefinitionsClass$RunDefinitions.Predef_classOf$lzycompute(Definitions.scala:1428)
[quick.reflect]     at scala.reflect.internal.Definitions$DefinitionsClass$RunDefinitions.Predef_classOf(Definitions.scala:1428)
[quick.reflect]     at scala.reflect.internal.Definitions$DefinitionsClass$RunDefinitions.isPredefClassOf(Definitions.scala:1419)
[quick.reflect]     at scala.tools.nsc.typechecker.Typers$Typer.typedIdent$2(Typers.scala:4803)
[quick.reflect]     at scala.tools.nsc.typechecker.Typers$Typer.typedIdentOrWildcard$1(Typers.scala:4823)
[quick.reflect]     at scala.tools.nsc.typechecker.Typers$Typer.typedInAnyMode$1(Typers.scala:5258)
[quick.reflect]     at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5278)
[quick.reflect]     at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5314)
[quick.reflect]     at scala.tools.nsc.typechecker.Typers$Typer.scala$tools$nsc$typechecker$Typers$Typer$$typedInternal(Typers.scala:5341)
[quick.reflect]     at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5288)
[quick.reflect]     at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5292)
[quick.reflect]     at scala.tools.nsc.typechecker.Typers$Typer.typedQualifier(Typers.scala:5390)
[quick.reflect]     at scala.tools.nsc.typechecker.Typers$Typer.typedQualifier(Typers.scala:5396)
[quick.reflect]     at scala.tools.nsc.typechecker.Typers$Typer.typedSelectOrSuperCall$1(Typers.scala:4728)
[quick.reflect]     at scala.tools.nsc.typechecker.Typers$Typer.typedInAnyMode$1(Typers.scala:5262)
[quick.reflect]     at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5278)
[quick.reflect]     at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5314)
[quick.reflect]     at scala.tools.nsc.typechecker.Typers$Typer.scala$tools$nsc$typechecker$Typers$Typer$$typedInternal(Typers.scala:5341)
[quick.reflect]     at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5288)
[quick.reflect]     at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5292)
[quick.reflect]     at scala.tools.nsc.typechecker.Typers$Typer.typedTypeConstructor(Typers.scala:5450)
[quick.reflect]     at scala.tools.nsc.typechecker.Typers$Typer.typedTypeConstructor(Typers.scala:5467)
[quick.reflect]     at scala.tools.nsc.typechecker.Typers$Typer.scala$tools$nsc$typechecker$Typers$Typer$$typedParentType(Typers.scala:1457)
[quick.reflect]     at scala.tools.nsc.typechecker.Typers$Typer.typedParentTypes(Typers.scala:1614)
[quick.reflect]     at scala.tools.nsc.typechecker.Namers$Namer.templateSig(Namers.scala:901)
[quick.reflect]     at scala.tools.nsc.typechecker.Namers$Namer.moduleSig(Namers.scala:971)
[quick.reflect]     at scala.tools.nsc.typechecker.Namers$Namer.getSig$1(Namers.scala:1498)
[quick.reflect]     at scala.tools.nsc.typechecker.Namers$Namer.typeSig(Namers.scala:1513)
[quick.reflect]     at scala.tools.nsc.typechecker.Namers$Namer$$anonfun$monoTypeCompleter$1$$anonfun$apply$1.apply$mcV$sp(Namers.scala:763)
[quick.reflect]     at scala.tools.nsc.typechecker.Namers$Namer$$anonfun$monoTypeCompleter$1$$anonfun$apply$1.apply(Namers.scala:762)
[quick.reflect]     at scala.tools.nsc.typechecker.Namers$Namer$$anonfun$monoTypeCompleter$1$$anonfun$apply$1.apply(Namers.scala:762)
[quick.reflect]     at scala.tools.nsc.typechecker.Namers$Namer.scala$tools$nsc$typechecker$Namers$Namer$$logAndValidate(Namers.scala:1540)
[quick.reflect]     at scala.tools.nsc.typechecker.Namers$Namer$$anonfun$monoTypeCompleter$1.apply(Namers.scala:762)
[quick.reflect]     at scala.tools.nsc.typechecker.Namers$Namer$$anonfun$monoTypeCompleter$1.apply(Namers.scala:754)
[quick.reflect]     at scala.tools.nsc.typechecker.Namers$$anon$1.completeImpl(Namers.scala:1655)
[quick.reflect]     at scala.tools.nsc.typechecker.Namers$LockingTypeCompleter$class.complete(Namers.scala:1663)
[quick.reflect]     at scala.tools.nsc.typechecker.Namers$$anon$1.complete(Namers.scala:1653)
[quick.reflect]     at scala.reflect.internal.Symbols$Symbol.info(Symbols.scala:1331)
[quick.reflect]     at scala.reflect.internal.SymbolTable.openPackageModule(SymbolTable.scala:291)
[quick.reflect]     at scala.tools.nsc.typechecker.Analyzer$packageObjects$$anon$2$$anon$4.traverse(Analyzer.scala:63)
[quick.reflect]     at scala.tools.nsc.typechecker.Analyzer$packageObjects$$anon$2$$anon$4.traverse(Analyzer.scala:59)
[quick.reflect]     at scala.reflect.api.Trees$Traverser$$anonfun$traverseStats$1$$anonfun$apply$1.apply$mcV$sp(Trees.scala:2581)
[quick.reflect]     at scala.reflect.api.Trees$Traverser.atOwner(Trees.scala:2590)
[quick.reflect]     at scala.reflect.api.Trees$Traverser.traverseStats(Trees.scala:2580)
[quick.reflect]     at scala.reflect.internal.Trees$class.itraverse(Trees.scala:1312)
[quick.reflect]     at scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:15)
[quick.reflect]     at scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:15)
[quick.reflect]     at scala.reflect.api.Trees$Traverser.traverse(Trees.scala:2558)
[quick.reflect]     at scala.tools.nsc.typechecker.Analyzer$packageObjects$$anon$2$$anon$4.traverse(Analyzer.scala:66)
[quick.reflect]     at scala.tools.nsc.typechecker.Analyzer$packageObjects$$anon$2$$anon$4.traverse(Analyzer.scala:59)
[quick.reflect]     at scala.reflect.api.Trees$Traverser$$anonfun$traverseStats$1$$anonfun$apply$1.apply$mcV$sp(Trees.scala:2581)
[quick.reflect]     at scala.reflect.api.Trees$Traverser.atOwner(Trees.scala:2590)
[quick.reflect]     at scala.reflect.api.Trees$Traverser.traverseStats(Trees.scala:2580)
[quick.reflect]     at scala.reflect.internal.Trees$class.itraverse(Trees.scala:1312)
[quick.reflect]     at scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:15)
[quick.reflect]     at scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:15)
[quick.reflect]     at scala.reflect.api.Trees$Traverser.traverse(Trees.scala:2558)
[quick.reflect]     at scala.tools.nsc.typechecker.Analyzer$packageObjects$$anon$2$$anon$4.traverse(Analyzer.scala:66)
[quick.reflect]     at scala.tools.nsc.typechecker.Analyzer$packageObjects$$anon$2$$anon$4.traverse(Analyzer.scala:59)
[quick.reflect]     at scala.reflect.api.Trees$Traverser$$anonfun$traverseStats$1$$anonfun$apply$1.apply$mcV$sp(Trees.scala:2581)
[quick.reflect]     at scala.reflect.api.Trees$Traverser.atOwner(Trees.scala:2590)
[quick.reflect]     at scala.reflect.api.Trees$Traverser.traverseStats(Trees.scala:2580)
[quick.reflect]     at scala.reflect.internal.Trees$class.itraverse(Trees.scala:1312)
[quick.reflect]     at scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:15)
[quick.reflect]     at scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:15)
[quick.reflect]     at scala.reflect.api.Trees$Traverser.traverse(Trees.scala:2558)
[quick.reflect]     at scala.tools.nsc.typechecker.Analyzer$packageObjects$$anon$2$$anon$4.traverse(Analyzer.scala:66)
[quick.reflect]     at scala.tools.nsc.typechecker.Analyzer$packageObjects$$anon$2$$anon$4.traverse(Analyzer.scala:59)
[quick.reflect]     at scala.reflect.api.Trees$Traverser.apply(Trees.scala:2596)
[quick.reflect]     at scala.tools.nsc.typechecker.Analyzer$packageObjects$$anon$2.apply(Analyzer.scala:71)
[quick.reflect]     at scala.tools.nsc.Global$GlobalPhase.applyPhase(Global.scala:424)
[quick.reflect]     at scala.tools.nsc.Global$GlobalPhase$$anonfun$run$1.apply(Global.scala:391)
[quick.reflect]     at scala.tools.nsc.Global$GlobalPhase$$anonfun$run$1.apply(Global.scala:391)
[quick.reflect]     at scala.collection.Iterator$class.foreach(Iterator.scala:743)
[quick.reflect]     at scala.collection.AbstractIterator.foreach(Iterator.scala:1174)
[quick.reflect]     at scala.tools.nsc.Global$GlobalPhase.run(Global.scala:391)
[quick.reflect]     at scala.tools.nsc.Global$Run.compileUnitsInternal(Global.scala:1603)
[quick.reflect]     at scala.tools.nsc.Global$Run.compileUnits(Global.scala:1588)
[quick.reflect]     at scala.tools.nsc.Global$Run.compileSources(Global.scala:1583)
[quick.reflect]     at scala.tools.nsc.Global$Run.compile(Global.scala:1681)
[quick.reflect]     at scala.tools.nsc.Driver.doCompile(Driver.scala:34)
[quick.reflect]     at scala.tools.nsc.MainClass.doCompile(Main.scala:23)
[quick.reflect]     at scala.tools.nsc.Driver.process(Driver.scala:55)
[quick.reflect]     at scala.tools.nsc.Driver.main(Driver.scala:68)
[quick.reflect]     at scala.tools.nsc.Main.main(Main.scala)

@xeno-by
Copy link
Member

xeno-by commented Feb 6, 2014

@soc Don't think it's an initialization issue. To the best of my knowledge, we don't have those in compile-time reflection. I might be wrong though. /cc @retronym

@soc
Copy link
Member Author

soc commented Feb 7, 2014

When compiling with -Ydebug, I get this:

quick.reflect:
[quick.reflect] Compiling 156 files to /home/soc/Entwicklung/scala/build/quick/classes/reflect
[quick.reflect] [running phase parser on 156 compilation units]
[quick.reflect] [running phase namer on 156 compilation units]
[quick.reflect] [running phase packageobjects on 156 compilation units]
[quick.reflect] warning: !!! exception when typing scala, pt=?
[quick.reflect] warning: !!! exception when typing scala.AnyRef, pt=?
[quick.reflect] error: scala.reflect.internal.FatalError: module Predef does not have a member classOf
[quick.reflect]     at scala.reflect.internal.Definitions$DefinitionsClass.scala$reflect$internal$Definitions$DefinitionsClass$$fatalMissingSymbol(Definitions.scala:1146)
...

I have absolutely no idea what's happening here.

@soc
Copy link
Member Author

soc commented Feb 9, 2014

@retronym Any idea what's happening here?

@retronym
Copy link
Member

retronym commented Feb 9, 2014

-Ydebug was triggering spurious cycles do to logging in low-level places. I fixed that in #3381

Build yourself a new locker to workaround:

% cat build.properties
#locker.skip=0
#starr.use.released=0
% ant all.clean build

You might also need to rebase this onto master.

@soc
Copy link
Member Author

soc commented Feb 10, 2014

@retronym Mhhh, do you mean versions.properties?

@retronym
Copy link
Member

Build.properties is an optional file that can contain local ant properties.
One of them disables the locker phase. Not having the file at all is also
okay for what you are doing.

On Monday, February 10, 2014, soc notifications@github.com wrote:

@retronym https://github.com/retronym Mhhh, do you mean
versions.properties?

Reply to this email directly or view it on GitHubhttps://github.com//pull/3459#issuecomment-34609744
.

@gkossakowski
Copy link
Member

@soc: what's the status of this?

@soc
Copy link
Member Author

soc commented Feb 10, 2014

@gkossakowski I'm slowly losing my mind. With @retronym's change, it at least compiles locally, but now suddenly the compiler pretends that the elements annotated with Scala annotations don't exist anymore.

@foo val bar = 1
//Somewhere else:
println(bar)
// scalac: Hey dude, bar doesn't exist, amiright?!

@gkossakowski
Copy link
Member

Huh, that's strange indeed.

In any case, I think we'll need to push this to 2.11.1 (if the change retains binary compatibility) or 2.12. Please reopen once we are done with 2.11.0 RCs.

@soc
Copy link
Member Author

soc commented Feb 10, 2014

@gkossakowski Alright, no problem. I will look into it as soon as trunk is a bit more stable again (doesn't make sense if I get it to run locally, but PR validation still fails ...)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
5 participants