aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDmitry Petrashko <dark@d-d.me>2016-04-08 14:48:39 +0300
committerDmitry Petrashko <dark@d-d.me>2016-04-08 14:48:39 +0300
commit1c56d8ca76626f2fa83bc9f6bbb74db053324a61 (patch)
tree6588385665eb9cfe48ad62aa7bf9b82d07a8e567 /src
parent474d99792fd330f59f7b75b45bee80f52ce65082 (diff)
parent30b3840efe59537d8ba37d42fe7ec9e976cda7dc (diff)
downloaddotty-1c56d8ca76626f2fa83bc9f6bbb74db053324a61.tar.gz
dotty-1c56d8ca76626f2fa83bc9f6bbb74db053324a61.tar.bz2
dotty-1c56d8ca76626f2fa83bc9f6bbb74db053324a61.zip
Merge pull request #1201 from liufengyun/i972
Check Java classes are not used as objects
Diffstat (limited to 'src')
-rw-r--r--src/dotty/tools/dotc/transform/TreeChecker.scala74
1 files changed, 74 insertions, 0 deletions
diff --git a/src/dotty/tools/dotc/transform/TreeChecker.scala b/src/dotty/tools/dotc/transform/TreeChecker.scala
index dadaf52e2..39f407f9b 100644
--- a/src/dotty/tools/dotc/transform/TreeChecker.scala
+++ b/src/dotty/tools/dotc/transform/TreeChecker.scala
@@ -181,6 +181,80 @@ class TreeChecker extends Phase with SymTransformer {
if (tree.symbol.maybeOwner.isTerm)
assert(nowDefinedSyms contains tree.symbol, i"undefined symbol ${tree.symbol}")
+ /** assert Java classes are not used as objects */
+ def assertIdentNotJavaClass(tree: Tree)(implicit ctx: Context): Unit = tree match {
+ case _ : untpd.Ident =>
+ assert(!tree.symbol.is(JavaModule), "Java class can't be used as value: " + tree)
+ case _ =>
+ }
+
+ /** check Java classes are not used as objects */
+ def checkIdentNotJavaClass(tree: Tree)(implicit ctx: Context): Unit = tree match {
+ // case tree: untpd.Ident =>
+ // case tree: untpd.Select =>
+ // case tree: untpd.SelectFromTypeTree =>
+ // case tree: untpd.Bind =>
+ case vd : ValDef =>
+ assertIdentNotJavaClass(vd.forceIfLazy)
+ case dd : DefDef =>
+ assertIdentNotJavaClass(dd.forceIfLazy)
+ // case tree: untpd.TypeDef =>
+ case Apply(fun, args) =>
+ assertIdentNotJavaClass(fun)
+ args.foreach(assertIdentNotJavaClass _)
+ // case tree: untpd.This =>
+ // case tree: untpd.Literal =>
+ // case tree: untpd.New =>
+ case Pair(left, right) =>
+ assertIdentNotJavaClass(left)
+ assertIdentNotJavaClass(right)
+ case Typed(expr, _) =>
+ assertIdentNotJavaClass(expr)
+ case NamedArg(_, arg) =>
+ assertIdentNotJavaClass(arg)
+ case Assign(_, rhs) =>
+ assertIdentNotJavaClass(rhs)
+ case Block(stats, expr) =>
+ stats.foreach(assertIdentNotJavaClass _)
+ assertIdentNotJavaClass(expr)
+ case If(_, thenp, elsep) =>
+ assertIdentNotJavaClass(thenp)
+ assertIdentNotJavaClass(elsep)
+ // case tree: untpd.Closure =>
+ case Match(selector, cases) =>
+ assertIdentNotJavaClass(selector)
+ cases.foreach(caseDef => assertIdentNotJavaClass(caseDef.body))
+ case Return(expr, _) =>
+ assertIdentNotJavaClass(expr)
+ case Try(expr, cases, finalizer) =>
+ assertIdentNotJavaClass(expr)
+ cases.foreach(caseDef => assertIdentNotJavaClass(caseDef.body))
+ assertIdentNotJavaClass(finalizer)
+ // case tree: TypeApply =>
+ // case tree: Super =>
+ case SeqLiteral(elems, _) =>
+ elems.foreach(assertIdentNotJavaClass)
+ // case tree: TypeTree =>
+ // case tree: SingletonTypeTree =>
+ // case tree: AndTypeTree =>
+ // case tree: OrTypeTree =>
+ // case tree: RefinedTypeTree =>
+ // case tree: AppliedTypeTree =>
+ // case tree: ByNameTypeTree =>
+ // case tree: TypeBoundsTree =>
+ // case tree: Alternative =>
+ // case tree: PackageDef =>
+ case Annotated(_, arg) =>
+ assertIdentNotJavaClass(arg)
+ case _ =>
+ }
+
+ override def typed(tree: untpd.Tree, pt: Type = WildcardType)(implicit ctx: Context): tpd.Tree = {
+ val tpdTree = super.typed(tree)
+ checkIdentNotJavaClass(tpdTree)
+ tpdTree
+ }
+
override def typedUnadapted(tree: untpd.Tree, pt: Type)(implicit ctx: Context): tpd.Tree = {
val res = tree match {
case _: untpd.UnApply =>