| layout | title |
|---|---|
doc-page |
Explicit Nulls |
This proposal describes a modification to the Scala type system that makes reference types
(anything that extends AnyRef) non-nullable.
This means the following code will no longer typecheck:
| diff --git a/src/scalap/scala/tools/scalap/Decode.scala b/src/scalap/scala/tools/scalap/Decode.scala | |
| index acef441..4e5197e 100644 | |
| --- a/src/scalap/scala/tools/scalap/Decode.scala | |
| +++ b/src/scalap/scala/tools/scalap/Decode.scala | |
| @@ -55,7 +55,7 @@ object Decode { | |
| classFile annotation SCALA_SIG_ANNOTATION map { case Annotation(_, els) => | |
| val bytesElem = els find (x => constant(x.elementNameIndex) == BYTES_VALUE) orNull | |
| - val _bytes = bytesElem.elementValue match { case ConstValueIndex(x) => constantWrapped(x) } | |
| + val _bytes = bytesElem.nn.elementValue match { case ConstValueIndex(x) => constantWrapped(x) } |
| diff --git a/cssparse/test/src-jvm/cssparse/ProjectTests.scala b/cssparse/test/src-jvm/cssparse/ProjectTests.scala | |
| index a9dcc39..bc76b63 100644 | |
| --- a/cssparse/test/src-jvm/cssparse/ProjectTests.scala | |
| +++ b/cssparse/test/src-jvm/cssparse/ProjectTests.scala | |
| @@ -10,7 +10,7 @@ object ProjectTests extends TestSuite { | |
| def checkCss()(implicit testPath: utest.framework.TestPath) = { | |
| val url = "https://github.com/" + testPath.value.last | |
| - val name = url.split("/").last | |
| + val name = url.split("/").last.nn |
| diff --git a/compiler-plugin/src/main/scala/scalapb/compiler/DescriptorImplicits.scala b/compiler-plugin/src/main/scala/scalapb/compiler/DescriptorImplicits.scala | |
| index cfcf0c3..24c3100 100644 | |
| --- a/compiler-plugin/src/main/scala/scalapb/compiler/DescriptorImplicits.scala | |
| +++ b/compiler-plugin/src/main/scala/scalapb/compiler/DescriptorImplicits.scala | |
| @@ -940,7 +940,7 @@ class DescriptorImplicits(params: GeneratorParams, files: Seq[FileDescriptor]) { | |
| } | |
| def baseName(fileName: String) = | |
| - fileName.split("/").last.replaceAll(raw"[.]proto$$|[.]protodevel", "") | |
| + fileName.split("/").last.nn.replaceAll(raw"[.]proto$$|[.]protodevel", "") |
| diff --git a/src/main/scala/dotty/semanticdb/SourceFile.scala b/src/main/scala/dotty/semanticdb/SourceFile.scala | |
| index c53579b..34560bc 100644 | |
| --- a/src/main/scala/dotty/semanticdb/SourceFile.scala | |
| +++ b/src/main/scala/dotty/semanticdb/SourceFile.scala | |
| @@ -68,4 +68,4 @@ class SourceFile(path: java.nio.file.Path) { | |
| } | |
| return previous | |
| } | |
| -} | |
| \ No newline at end of file |
| diff --git a/shared/src/main/scala/minitest/api/Result.scala b/shared/src/main/scala/minitest/api/Result.scala | |
| index f681231..85aa4ab 100644 | |
| --- a/shared/src/main/scala/minitest/api/Result.scala | |
| +++ b/shared/src/main/scala/minitest/api/Result.scala | |
| @@ -55,7 +55,7 @@ object Result { | |
| } | |
| } | |
| - final case class Failure(msg: String, source: Option[Throwable], location: Option[SourceLocation]) | |
| + final case class Failure(msg: String | Null, source: Option[Throwable], location: Option[SourceLocation]) |
| diff --git a/jvm/src/main/scala/PlatformReadInstances.scala b/jvm/src/main/scala/PlatformReadInstances.scala | |
| index da707c4..73227a7 100644 | |
| --- a/jvm/src/main/scala/PlatformReadInstances.scala | |
| +++ b/jvm/src/main/scala/PlatformReadInstances.scala | |
| @@ -12,7 +12,7 @@ private[scopt] object platform { | |
| import java.net.{ InetAddress, URI } | |
| type ParseException = java.text.ParseException | |
| - def mkParseEx(s: String, p: Int) = new java.text.ParseException(s, p) | |
| + def mkParseEx(s: String | Null, p: Int) = new java.text.ParseException(s, p) |
| [info] Compiling 614 Scala sources and 148 Java sources to /home/anietoro/src/dotty2/community-build/community-projects/stdLib213/build/quick/classes/library ... | |
| [warn] bad option '-Ynew-collections' was ignored | |
| [warn] -- Warning: /home/anietoro/src/dotty2/community-build/community-projects/stdLib213/src/library/scala/collection/immutable/Vector.scala:1085:2 | |
| [warn] 1085 | private[immutable] final def gotoNewBlockStart(index: Int, depth: Int): Unit = { | |
| [warn] | ^ | |
| [warn] | Line is indented too far to the left, or a `}' is missing | |
| [warn] -- Warning: /home/anietoro/src/dotty2/community-build/community-projects/stdLib213/src/library/scala/concurrent/impl/Promise.scala:104:2 | |
| [warn] 104 | class DefaultPromise[T] private[this] (initial: AnyRef) extends AtomicReference[AnyRef](initial) with scala.concurrent.Promise[T] with scala.concurrent.Future[T] with (Try[T] => Unit) { | |
| [warn] | ^ | |
| [warn] | Line is indented too far to the left, or a `}' is missing |
| [warn] -- Deprecation Warning: /home/anietoro/src/dotty2/community-build/community-projects/ScalaPB/lenses/shared/src/main/scala/scalapb/lenses/Lenses.scala:108:12 | |
| [warn] 108 | s.mapValues { (m: B) => | |
| [warn] | ^^^^^^^^^^^ | |
| [warn] |method mapValues in trait MapOps is deprecated: Use .view.mapValues(f). A future version will include a strict version of this method (for now, .view.mapValues(f).toMap). | |
| [error] -- [E008] Member Not Found Error: /home/anietoro/src/dotty2/community-build/community-projects/ScalaPB/compiler-plugin/src/main/scala/scalapb/compiler/DescriptorImplicits.scala:943:29 | |
| [error] 943 | fileName.split("/").last.replaceAll(raw"[.]proto$$|[.]protodevel", "") | |
| [error] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| [error] | value replaceAll is not a member of String | Null | |
| [warn] one warning found | |
| [info] Done compiling. |
| layout | title |
|---|---|
doc-page |
Explicit Nulls |
This proposal describes a modification to the Scala type system that makes reference types
(anything that extends AnyRef) non-nullable.
This means the following code will no longer typecheck:
| layout | title |
|---|---|
doc-page |
Explicit Nulls |
The "explicit nulls" feature (enabled via a flag) changes the Scala type hierarchy
so that reference types (e.g. String) are non-nullable. We can still express nullability
with union types: e.g. val x: String|Null = null.
The implementation of the feature in dotty can be conceptually divided in several parts: