From fe61c8e8513051db3201a90accfc61c75c2b5b8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93lafur=20P=C3=A1ll=20Geirsson?= Date: Sat, 2 Feb 2019 15:22:43 +0100 Subject: [PATCH 1/2] Guard `Position.start` against `NoPosition` --- .../meta/internal/semanticdb/scalac/TextDocumentOps.scala | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/semanticdb/scalac/library/src/main/scala/scala/meta/internal/semanticdb/scalac/TextDocumentOps.scala b/semanticdb/scalac/library/src/main/scala/scala/meta/internal/semanticdb/scalac/TextDocumentOps.scala index 8b829210a0..e0d463f47d 100644 --- a/semanticdb/scalac/library/src/main/scala/scala/meta/internal/semanticdb/scalac/TextDocumentOps.scala +++ b/semanticdb/scalac/library/src/main/scala/scala/meta/internal/semanticdb/scalac/TextDocumentOps.scala @@ -630,7 +630,9 @@ trait TextDocumentOps { self: SemanticdbOps => case gtree: g.MemberDef => gtree.symbol.annotations.foreach(ann => traverse(ann.original)) tryFindMtree(gtree) - if (!gtree.symbol.isSynthetic && msinglevalpats.contains(gtree.pos.start)) { + if (!gtree.symbol.isSynthetic && + gtree.pos.isRange && + msinglevalpats.contains(gtree.pos.start)) { // Map Defn.Val position of val pattern with single binder to the position // of the single binder. For example, map `val Foo(x) = ..` to the position of `x`. val mpos = msinglevalpats(gtree.pos.start) @@ -639,7 +641,9 @@ trait TextDocumentOps { self: SemanticdbOps => } case _: g.Apply | _: g.TypeApply => tryFindSynthetic(gtree) - tryNamedArg(gtree, gtree.pos.start, gtree.pos.point) + if (gtree.pos.isRange) { + tryNamedArg(gtree, gtree.pos.start, gtree.pos.point) + } case select: g.Select if isSyntheticName(select) => tryFindMtree(select.qualifier) tryFindSynthetic(select) From 582ffb7759def1bae860610841bd59b535559ae4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93lafur=20P=C3=A1ll=20Geirsson?= Date: Sat, 2 Feb 2019 15:32:47 +0100 Subject: [PATCH 2/2] Only the paranoid survive, better be safe than NPE --- .../scala/meta/internal/semanticdb/scalac/SymbolOps.scala | 2 +- .../meta/internal/semanticdb/scalac/TextDocumentOps.scala | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/semanticdb/scalac/library/src/main/scala/scala/meta/internal/semanticdb/scalac/SymbolOps.scala b/semanticdb/scalac/library/src/main/scala/scala/meta/internal/semanticdb/scalac/SymbolOps.scala index 21c8b727ec..f9acaed53a 100644 --- a/semanticdb/scalac/library/src/main/scala/scala/meta/internal/semanticdb/scalac/SymbolOps.scala +++ b/semanticdb/scalac/library/src/main/scala/scala/meta/internal/semanticdb/scalac/SymbolOps.scala @@ -313,7 +313,7 @@ trait SymbolOps { self: SemanticdbOps => val minput = loop(sym).toInput if (minput == m.Input.None) Symbols.None else { - val hasPosition = sym.pos.isDefined + val hasPosition = sym.pos != null && sym.pos.isDefined val conflict = if (hasPosition) pointsCache.get(sym.pos.point) else null diff --git a/semanticdb/scalac/library/src/main/scala/scala/meta/internal/semanticdb/scalac/TextDocumentOps.scala b/semanticdb/scalac/library/src/main/scala/scala/meta/internal/semanticdb/scalac/TextDocumentOps.scala index e0d463f47d..1960b658be 100644 --- a/semanticdb/scalac/library/src/main/scala/scala/meta/internal/semanticdb/scalac/TextDocumentOps.scala +++ b/semanticdb/scalac/library/src/main/scala/scala/meta/internal/semanticdb/scalac/TextDocumentOps.scala @@ -630,7 +630,9 @@ trait TextDocumentOps { self: SemanticdbOps => case gtree: g.MemberDef => gtree.symbol.annotations.foreach(ann => traverse(ann.original)) tryFindMtree(gtree) - if (!gtree.symbol.isSynthetic && + if (gtree.symbol != null && + !gtree.symbol.isSynthetic && + gtree.pos != null && gtree.pos.isRange && msinglevalpats.contains(gtree.pos.start)) { // Map Defn.Val position of val pattern with single binder to the position @@ -641,7 +643,7 @@ trait TextDocumentOps { self: SemanticdbOps => } case _: g.Apply | _: g.TypeApply => tryFindSynthetic(gtree) - if (gtree.pos.isRange) { + if (gtree.pos != null && gtree.pos.isRange) { tryNamedArg(gtree, gtree.pos.start, gtree.pos.point) } case select: g.Select if isSyntheticName(select) =>