Skip to content

Commit 1c56d8c

Browse files
committed
Merge pull request #1201 from liufengyun/i972
Check Java classes are not used as objects
2 parents 474d997 + 30b3840 commit 1c56d8c

File tree

1 file changed

+74
-0
lines changed

1 file changed

+74
-0
lines changed

src/dotty/tools/dotc/transform/TreeChecker.scala

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,80 @@ class TreeChecker extends Phase with SymTransformer {
181181
if (tree.symbol.maybeOwner.isTerm)
182182
assert(nowDefinedSyms contains tree.symbol, i"undefined symbol ${tree.symbol}")
183183

184+
/** assert Java classes are not used as objects */
185+
def assertIdentNotJavaClass(tree: Tree)(implicit ctx: Context): Unit = tree match {
186+
case _ : untpd.Ident =>
187+
assert(!tree.symbol.is(JavaModule), "Java class can't be used as value: " + tree)
188+
case _ =>
189+
}
190+
191+
/** check Java classes are not used as objects */
192+
def checkIdentNotJavaClass(tree: Tree)(implicit ctx: Context): Unit = tree match {
193+
// case tree: untpd.Ident =>
194+
// case tree: untpd.Select =>
195+
// case tree: untpd.SelectFromTypeTree =>
196+
// case tree: untpd.Bind =>
197+
case vd : ValDef =>
198+
assertIdentNotJavaClass(vd.forceIfLazy)
199+
case dd : DefDef =>
200+
assertIdentNotJavaClass(dd.forceIfLazy)
201+
// case tree: untpd.TypeDef =>
202+
case Apply(fun, args) =>
203+
assertIdentNotJavaClass(fun)
204+
args.foreach(assertIdentNotJavaClass _)
205+
// case tree: untpd.This =>
206+
// case tree: untpd.Literal =>
207+
// case tree: untpd.New =>
208+
case Pair(left, right) =>
209+
assertIdentNotJavaClass(left)
210+
assertIdentNotJavaClass(right)
211+
case Typed(expr, _) =>
212+
assertIdentNotJavaClass(expr)
213+
case NamedArg(_, arg) =>
214+
assertIdentNotJavaClass(arg)
215+
case Assign(_, rhs) =>
216+
assertIdentNotJavaClass(rhs)
217+
case Block(stats, expr) =>
218+
stats.foreach(assertIdentNotJavaClass _)
219+
assertIdentNotJavaClass(expr)
220+
case If(_, thenp, elsep) =>
221+
assertIdentNotJavaClass(thenp)
222+
assertIdentNotJavaClass(elsep)
223+
// case tree: untpd.Closure =>
224+
case Match(selector, cases) =>
225+
assertIdentNotJavaClass(selector)
226+
cases.foreach(caseDef => assertIdentNotJavaClass(caseDef.body))
227+
case Return(expr, _) =>
228+
assertIdentNotJavaClass(expr)
229+
case Try(expr, cases, finalizer) =>
230+
assertIdentNotJavaClass(expr)
231+
cases.foreach(caseDef => assertIdentNotJavaClass(caseDef.body))
232+
assertIdentNotJavaClass(finalizer)
233+
// case tree: TypeApply =>
234+
// case tree: Super =>
235+
case SeqLiteral(elems, _) =>
236+
elems.foreach(assertIdentNotJavaClass)
237+
// case tree: TypeTree =>
238+
// case tree: SingletonTypeTree =>
239+
// case tree: AndTypeTree =>
240+
// case tree: OrTypeTree =>
241+
// case tree: RefinedTypeTree =>
242+
// case tree: AppliedTypeTree =>
243+
// case tree: ByNameTypeTree =>
244+
// case tree: TypeBoundsTree =>
245+
// case tree: Alternative =>
246+
// case tree: PackageDef =>
247+
case Annotated(_, arg) =>
248+
assertIdentNotJavaClass(arg)
249+
case _ =>
250+
}
251+
252+
override def typed(tree: untpd.Tree, pt: Type = WildcardType)(implicit ctx: Context): tpd.Tree = {
253+
val tpdTree = super.typed(tree)
254+
checkIdentNotJavaClass(tpdTree)
255+
tpdTree
256+
}
257+
184258
override def typedUnadapted(tree: untpd.Tree, pt: Type)(implicit ctx: Context): tpd.Tree = {
185259
val res = tree match {
186260
case _: untpd.UnApply =>

0 commit comments

Comments
 (0)