@@ -181,6 +181,80 @@ class TreeChecker extends Phase with SymTransformer {
181
181
if (tree.symbol.maybeOwner.isTerm)
182
182
assert(nowDefinedSyms contains tree.symbol, i " undefined symbol ${tree.symbol}" )
183
183
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
+
184
258
override def typedUnadapted (tree : untpd.Tree , pt : Type )(implicit ctx : Context ): tpd.Tree = {
185
259
val res = tree match {
186
260
case _ : untpd.UnApply =>
0 commit comments