Drop edition variable from Rust support

Same as in case of C/C++ and -std= flag, this can be simply passed
as a rustflags.

Change-Id: Idafcac0cfbbb84be71ed41e394d246edce89b0b9
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/6140
Reviewed-by: Brett Wilson <brettw@chromium.org>
Commit-Queue: Petr Hosek <phosek@google.com>
diff --git a/docs/reference.md b/docs/reference.md
index 1601d01..c9dba3d 100644
--- a/docs/reference.md
+++ b/docs/reference.md
@@ -112,7 +112,6 @@
     *   [defines: [string list] C preprocessor defines.](#var_defines)
     *   [depfile: [string] File name for input dependencies for actions.](#var_depfile)
     *   [deps: [label list] Private linked dependencies.](#var_deps)
-    *   [edition: [string] The rustc edition to use in compiliation.](#var_edition)
     *   [friend: [label pattern list] Allow targets to include private headers.](#var_friend)
     *   [include_dirs: [directory list] Additional include directories.](#var_include_dirs)
     *   [inputs: [file list] Additional compile-time dependencies.](#var_inputs)
@@ -1561,7 +1560,7 @@
   General: check_includes, configs, data, friend, inputs, metadata,
            output_name, output_extension, public, sources, testonly,
            visibility
-  Rust variables: aliased_deps, crate_root, crate_name, edition
+  Rust variables: aliased_deps, crate_root, crate_name
 ```
 ### <a name="func_generated_file"></a>**generated_file**: Declare a generated_file target.
 
@@ -1755,7 +1754,7 @@
   General: check_includes, configs, data, friend, inputs, metadata,
            output_name, output_extension, public, sources, testonly,
            visibility
-  Rust variables: aliased_deps, crate_root, crate_name, crate_type, edition
+  Rust variables: aliased_deps, crate_root, crate_name, crate_type
 ```
 ### <a name="func_rust_library"></a>**rust_library**: Declare a Rust library target.
 
@@ -1787,7 +1786,7 @@
   General: check_includes, configs, data, friend, inputs, metadata,
            output_name, output_extension, public, sources, testonly,
            visibility
-  Rust variables: aliased_deps, crate_root, crate_name, edition
+  Rust variables: aliased_deps, crate_root, crate_name
 ```
 ### <a name="func_shared_library"></a>**shared_library**: Declare a shared library target.
 
@@ -1821,7 +1820,7 @@
   General: check_includes, configs, data, friend, inputs, metadata,
            output_name, output_extension, public, sources, testonly,
            visibility
-  Rust variables: aliased_deps, crate_root, crate_name, crate_type, edition
+  Rust variables: aliased_deps, crate_root, crate_name, crate_type
 ```
 ### <a name="func_source_set"></a>**source_set**: Declare a source set target.
 
@@ -1900,7 +1899,7 @@
   General: check_includes, configs, data, friend, inputs, metadata,
            output_name, output_extension, public, sources, testonly,
            visibility
-  Rust variables: aliased_deps, crate_root, crate_name, edition
+  Rust variables: aliased_deps, crate_root, crate_name
 
   The tools and commands used to create this target type will be
   determined by the source files in its sources. Targets containing
@@ -2471,12 +2470,6 @@
   process_file_template will return for those inputs (see "gn help
   process_file_template").
 
-  binary targets (executables, libraries): this will return a list of the
-  resulting binary file(s). The "main output" (the actual binary or library)
-  will always be the 0th element in the result. Depending on the platform and
-  output type, there may be other output files as well (like import libraries)
-  which will follow.
-
   source sets and groups: this will return a list containing the path of the
   "stamp" file that Ninja will produce once all outputs are generated. This
   probably isn't very useful.
@@ -2612,7 +2605,7 @@
   toolchain("toolchain") {
     tool("link") {
       command = "..."
-      pool = ":link_pool($default_toolchain)")
+      pool = ":link_pool($default_toolchain)"
     }
   }
 ```
@@ -5101,16 +5094,6 @@
 
   See also "public_deps".
 ```
-### <a name="var_edition"></a>**edition**: [string] The rustc edition to use in compiliation.
-
-```
-  Valid for `rust_library` targets and `executable`, `static_library`,
-  `shared_library`, and `source_set` targets that contain Rust sources.
-
-  This indicates the compiler edition to use in compilition. Should be a value
-  like "2015" or "2018", indiicating the appropriate value to pass to the
-  `--edition=<>` flag in rustc.
-```
 ### <a name="var_friend"></a>**friend**: Allow targets to include private headers.
 
 ```
diff --git a/examples/rust_example/build/BUILD.gn b/examples/rust_example/build/BUILD.gn
index e4aecfd..9684bf1 100644
--- a/examples/rust_example/build/BUILD.gn
+++ b/examples/rust_example/build/BUILD.gn
@@ -2,7 +2,7 @@
   outfile = "{{target_out_dir}}/{{rustc_output_prefix}}{{crate_name}}{{rustc_output_extension}}"
   tool("rustc") {
     depfile = "{{target_out_dir}}/{{crate_name}}.d"
-    command = "rustc --edition={{edition}} --crate-name {{crate_name}} {{source}} --crate-type {{crate_type}} --emit=dep-info=$depfile,link {{rustflags}} -o $outfile {{rustdeps}} {{externs}}"
+    command = "rustc --crate-name {{crate_name}} {{source}} --crate-type {{crate_type}} --emit=dep-info=$depfile,link {{rustflags}} -o $outfile {{rustdeps}} {{externs}}"
     description = "RUST $outfile"
     cdylib_output_extension = ".so"
     proc_macro_output_extension = ".so"
diff --git a/examples/rust_example/hello_world/bar/src/BUILD.gn b/examples/rust_example/hello_world/bar/src/BUILD.gn
index 49c6eee..b4eec33 100644
--- a/examples/rust_example/hello_world/bar/src/BUILD.gn
+++ b/examples/rust_example/hello_world/bar/src/BUILD.gn
@@ -1,4 +1,3 @@
 rust_library("bar") {
   crate_root = "lib.rs"
-  edition = "2018"
 }
diff --git a/examples/rust_example/hello_world/foo/src/BUILD.gn b/examples/rust_example/hello_world/foo/src/BUILD.gn
index 61ee1f3..b7b94e2 100644
--- a/examples/rust_example/hello_world/foo/src/BUILD.gn
+++ b/examples/rust_example/hello_world/foo/src/BUILD.gn
@@ -2,7 +2,6 @@
   sources = [
     "lib.rs",
   ]
-  edition = "2018"
   deps = [
     "//hello_world/bar/src:bar",
   ]
diff --git a/examples/rust_example/hello_world/src/BUILD.gn b/examples/rust_example/hello_world/src/BUILD.gn
index d6a0a66..e55f289 100644
--- a/examples/rust_example/hello_world/src/BUILD.gn
+++ b/examples/rust_example/hello_world/src/BUILD.gn
@@ -5,7 +5,6 @@
   deps = [
     "//hello_world/foo/src:foo",
   ]
-  edition = "2018"
   aliased_deps = {
     baz = "//hello_world/foo/src:foo"
   }
diff --git a/tools/gn/functions_target.cc b/tools/gn/functions_target.cc
index c20c1e6..4112f2e 100644
--- a/tools/gn/functions_target.cc
+++ b/tools/gn/functions_target.cc
@@ -21,10 +21,9 @@
   "           output_name, output_extension, public, sources, testonly,\n" \
   "           visibility\n"
 #define RUST_VARS \
-  "  Rust variables: aliased_deps, crate_root, crate_name, edition\n"
+  "  Rust variables: aliased_deps, crate_root, crate_name\n"
 #define RUST_SHARED_VARS                                                 \
-  "  Rust variables: aliased_deps, crate_root, crate_name, crate_type, " \
-  "edition\n"
+  "  Rust variables: aliased_deps, crate_root, crate_name, crate_type\n"
 
 namespace functions {
 
diff --git a/tools/gn/functions_target_rust_unittest.cc b/tools/gn/functions_target_rust_unittest.cc
index 37bd8b1..2d3578f 100644
--- a/tools/gn/functions_target_rust_unittest.cc
+++ b/tools/gn/functions_target_rust_unittest.cc
@@ -24,7 +24,6 @@
       "executable(\"foo\") {\n"
       "  crate_name = \"foo_crate\"\n"
       "  sources = [ \"foo.rs\", \"lib.rs\", \"main.rs\" ]\n"
-      "  edition = \"2018\""
       "}\n");
   ASSERT_FALSE(exe_input.has_error());
   Err err;
@@ -36,7 +35,6 @@
   TestParseInput lib_input(
       "executable(\"foo\") {\n"
       "  sources = [ \"lib.rs\" ]\n"
-      "  edition = \"2018\""
       "}\n");
   ASSERT_FALSE(lib_input.has_error());
   err = Err();
@@ -60,7 +58,6 @@
       "executable(\"foo\") {\n"
       "  crate_root = \"foo.rs\""
       "  sources = [ \"main.rs\" ]\n"
-      "  edition = \"2018\""
       "}\n");
   ASSERT_FALSE(normal_input.has_error());
   Err err;
@@ -75,7 +72,6 @@
       "  crate_root = \"foo.rs\""
       "  crate_type = \"dylib\"\n"
       "  sources = [ \"main.rs\" ]\n"
-      "  edition = \"2018\""
       "}\n");
   ASSERT_FALSE(normal_shlib_input.has_error());
   err = Err();
@@ -88,7 +84,6 @@
   TestParseInput exe_input(
       "executable(\"foo\") {\n"
       "  sources = [ \"foo.rs\", \"lib.rs\", \"main.rs\" ]\n"
-      "  edition = \"2018\""
       "}\n");
   ASSERT_FALSE(exe_input.has_error());
   err = Err();
@@ -101,7 +96,6 @@
   TestParseInput lib_input(
       "rust_library(\"libfoo\") {\n"
       "  sources = [ \"foo.rs\", \"lib.rs\", \"main.rs\" ]\n"
-      "  edition = \"2018\""
       "}\n");
   ASSERT_FALSE(lib_input.has_error());
   err = Err();
@@ -114,7 +108,6 @@
   TestParseInput singlesource_input(
       "executable(\"bar\") {\n"
       "  sources = [ \"bar.rs\" ]\n"
-      "  edition = \"2018\""
       "}\n");
   ASSERT_FALSE(singlesource_input.has_error());
   err = Err();
@@ -127,7 +120,6 @@
   TestParseInput error_input(
       "rust_library(\"foo\") {\n"
       "  sources = [ \"foo.rs\", \"main.rs\" ]\n"
-      "  edition = \"2018\""
       "}\n");
   ASSERT_FALSE(error_input.has_error());
   err = Err();
@@ -139,7 +131,6 @@
   TestParseInput nosources_input(
       "executable(\"bar\") {\n"
       "  crate_root = \"bar.rs\"\n"
-      "  edition = \"2018\""
       "}\n");
   ASSERT_FALSE(nosources_input.has_error());
   err = Err();
@@ -163,7 +154,6 @@
       "shared_library(\"libfoo\") {\n"
       "  crate_type = \"dylib\"\n"
       "  sources = [ \"lib.rs\" ]\n"
-      "  edition = \"2018\""
       "}\n");
   ASSERT_FALSE(lib_input.has_error());
   Err err;
@@ -176,7 +166,6 @@
       "executable(\"foo\") {\n"
       "  crate_type = \"rlib\"\n"
       "  sources = [ \"main.rs\" ]\n"
-      "  edition = \"2018\""
       "}\n");
   ASSERT_FALSE(exe_non_default_input.has_error());
   err = Err();
@@ -189,7 +178,6 @@
       "shared_library(\"foo\") {\n"
       "  crate_type = \"bad\"\n"
       "  sources = [ \"lib.rs\" ]\n"
-      "  edition = \"2018\""
       "}\n");
   ASSERT_FALSE(lib_error_input.has_error());
   err = Err();
@@ -200,7 +188,6 @@
   TestParseInput lib_missing_error_input(
       "shared_library(\"foo\") {\n"
       "  sources = [ \"lib.rs\" ]\n"
-      "  edition = \"2018\""
       "}\n");
   ASSERT_FALSE(lib_missing_error_input.has_error());
   err = Err();
@@ -286,40 +273,6 @@
             ":foo");
 }
 
-// Checks that the dition gets propagated correctly.
-TEST_F(RustFunctionsTarget, Edition) {
-  TestWithScope setup;
-
-  // The target generator needs a place to put the targets or it will fail.
-  Scope::ItemVector item_collector;
-  setup.scope()->set_item_collector(&item_collector);
-  setup.scope()->set_source_dir(SourceDir("/"));
-
-  TestParseInput lib_input(
-      "shared_library(\"libfoo\") {\n"
-      "  crate_type = \"dylib\"\n"
-      "  sources = [ \"lib.rs\" ]\n"
-      "  edition = \"2018\""
-      "}\n");
-  ASSERT_FALSE(lib_input.has_error());
-  Err err;
-  lib_input.parsed()->Execute(setup.scope(), &err);
-  ASSERT_FALSE(err.has_error()) << err.message();
-  ASSERT_EQ(item_collector.back()->AsTarget()->rust_values().edition(), "2018");
-
-  TestParseInput error_input(
-      "shared_library(\"foo\") {\n"
-      "  crate_type = \"dylib\"\n"
-      "  sources = [ \"lib.rs\" ]\n"
-      "}\n");
-  ASSERT_FALSE(error_input.has_error());
-  err = Err();
-  error_input.parsed()->Execute(setup.scope(), &err);
-  ASSERT_TRUE(err.has_error());
-  EXPECT_EQ("Missing \"edition\" in Rust target.", err.message())
-      << err.message();
-}
-
 // Checks aliased_deps parsing.
 TEST_F(RustFunctionsTarget, AliasedDeps) {
   TestWithScope setup;
@@ -333,7 +286,6 @@
       "executable(\"foo\") {\n"
       "  sources = [ \"main.rs\" ]\n"
       "  deps = [ \"//bar\", \"//baz\" ]\n"
-      "  edition = \"2018\""
       "  aliased_deps = {\n"
       "    bar_renamed = \"//bar\"\n"
       "    baz_renamed = \"//baz:baz\"\n"
@@ -363,7 +315,6 @@
       "executable(\"foo\") {\n"
       "  crate_name = \"foo_crate\"\n"
       "  sources = [ \"foo.rs\", \"lib.rs\", \"main.rs\" ]\n"
-      "  edition = \"2018\""
       "  public_configs = [ \":bar\" ]"
       "}\n");
   ASSERT_FALSE(exe_input.has_error());
diff --git a/tools/gn/ninja_rust_binary_target_writer.cc b/tools/gn/ninja_rust_binary_target_writer.cc
index 5372fec..47b3fb2 100644
--- a/tools/gn/ninja_rust_binary_target_writer.cc
+++ b/tools/gn/ninja_rust_binary_target_writer.cc
@@ -169,7 +169,6 @@
     WriteExterns(extern_deps);
 
     WriteRustdeps(rustdeps, nonrustdeps);
-    WriteEdition();
   }
 }
 
@@ -240,8 +239,3 @@
   }
   out_ << std::endl;
 }
-
-void NinjaRustBinaryTargetWriter::WriteEdition() {
-  DCHECK(!target_->rust_values().edition().empty());
-  out_ << "  edition = " << target_->rust_values().edition() << std::endl;
-}
diff --git a/tools/gn/ninja_rust_binary_target_writer_unittest.cc b/tools/gn/ninja_rust_binary_target_writer_unittest.cc
index 90d592b..f9027f5 100644
--- a/tools/gn/ninja_rust_binary_target_writer_unittest.cc
+++ b/tools/gn/ninja_rust_binary_target_writer_unittest.cc
@@ -68,7 +68,6 @@
   target.source_types_used().Set(SourceFile::SOURCE_RS);
   target.rust_values().set_crate_root(main);
   target.rust_values().crate_name() = "foo_bar";
-  target.rust_values().edition() = "2018";
   target.private_deps().push_back(LabelTargetPair(&source_set));
   target.SetToolchain(setup.toolchain());
   ASSERT_TRUE(target.OnResolved(&err));
@@ -91,8 +90,7 @@
         "\n"
         "build obj/foo/foo_bar: rustc ../../foo/main.rs | ../../foo/input3.rs "
         "../../foo/main.rs ../../foo/input1.rs ../../foo/input2.rs || "
-        "obj/foo/sources.stamp\n"
-        "  edition = 2018\n";
+        "obj/foo/sources.stamp\n";
     std::string out_str = out.str();
     EXPECT_EQ(expected, out_str) << out_str;
   }
@@ -111,7 +109,6 @@
   rlib.source_types_used().Set(SourceFile::SOURCE_RS);
   rlib.rust_values().set_crate_root(barlib);
   rlib.rust_values().crate_name() = "mylib";
-  rlib.rust_values().edition() = "2018";
   rlib.SetToolchain(setup.toolchain());
   ASSERT_TRUE(rlib.OnResolved(&err));
 
@@ -133,8 +130,7 @@
         "target_output_name = mylib\n"
         "\n"
         "build obj/bar/libmylib.rlib: rustc ../../bar/lib.rs | "
-        "../../bar/mylib.rs ../../bar/lib.rs\n"
-        "  edition = 2018\n";
+        "../../bar/mylib.rs ../../bar/lib.rs\n";
     std::string out_str = out.str();
     EXPECT_EQ(expected, out_str) << out_str;
   }
@@ -148,7 +144,6 @@
   another_rlib.source_types_used().Set(SourceFile::SOURCE_RS);
   another_rlib.rust_values().set_crate_root(lib);
   another_rlib.rust_values().crate_name() = "direct";
-  another_rlib.rust_values().edition() = "2018";
   another_rlib.SetToolchain(setup.toolchain());
   another_rlib.public_deps().push_back(LabelTargetPair(&rlib));
   ASSERT_TRUE(another_rlib.OnResolved(&err));
@@ -162,7 +157,6 @@
   target.source_types_used().Set(SourceFile::SOURCE_RS);
   target.rust_values().set_crate_root(main);
   target.rust_values().crate_name() = "foo_bar";
-  target.rust_values().edition() = "2018";
   target.private_deps().push_back(LabelTargetPair(&another_rlib));
   target.SetToolchain(setup.toolchain());
   ASSERT_TRUE(target.OnResolved(&err));
@@ -187,8 +181,7 @@
         "../../foo/main.rs obj/foo/libdirect.rlib obj/bar/libmylib.rlib\n"
         "  externs = --extern direct=obj/foo/libdirect.rlib --extern "
         "mylib=obj/bar/libmylib.rlib\n"
-        "  rustdeps = -Ldependency=obj/foo -Ldependency=obj/bar\n"
-        "  edition = 2018\n";
+        "  rustdeps = -Ldependency=obj/foo -Ldependency=obj/bar\n";
     std::string out_str = out.str();
     EXPECT_EQ(expected, out_str) << expected << "\n" << out_str;
   }
@@ -207,7 +200,6 @@
   another_rlib.source_types_used().Set(SourceFile::SOURCE_RS);
   another_rlib.rust_values().set_crate_root(lib);
   another_rlib.rust_values().crate_name() = "direct";
-  another_rlib.rust_values().edition() = "2018";
   another_rlib.SetToolchain(setup.toolchain());
   ASSERT_TRUE(another_rlib.OnResolved(&err));
 
@@ -221,7 +213,6 @@
   target.rust_values().set_crate_root(main);
   target.rust_values().crate_name() = "foo_bar";
   target.rust_values().aliased_deps()[another_rlib.label()] = "direct_renamed";
-  target.rust_values().edition() = "2018";
   target.private_deps().push_back(LabelTargetPair(&another_rlib));
   target.SetToolchain(setup.toolchain());
   ASSERT_TRUE(target.OnResolved(&err));
@@ -245,8 +236,7 @@
         "build obj/foo/foo_bar: rustc ../../foo/main.rs | ../../foo/source.rs "
         "../../foo/main.rs obj/foo/libdirect.rlib\n"
         "  externs = --extern direct_renamed=obj/foo/libdirect.rlib\n"
-        "  rustdeps = -Ldependency=obj/foo\n"
-        "  edition = 2018\n";
+        "  rustdeps = -Ldependency=obj/foo\n";
     std::string out_str = out.str();
     EXPECT_EQ(expected, out_str) << expected << "\n" << out_str;
   }
@@ -265,7 +255,6 @@
   rlib.source_types_used().Set(SourceFile::SOURCE_RS);
   rlib.rust_values().set_crate_root(barlib);
   rlib.rust_values().crate_name() = "mylib";
-  rlib.rust_values().edition() = "2018";
   rlib.SetToolchain(setup.toolchain());
   ASSERT_TRUE(rlib.OnResolved(&err));
 
@@ -286,7 +275,6 @@
   nonrust.source_types_used().Set(SourceFile::SOURCE_RS);
   nonrust.rust_values().set_crate_root(main);
   nonrust.rust_values().crate_name() = "foo_bar";
-  nonrust.rust_values().edition() = "2018";
   nonrust.private_deps().push_back(LabelTargetPair(&rlib));
   nonrust.private_deps().push_back(LabelTargetPair(&staticlib));
   nonrust.SetToolchain(setup.toolchain());
@@ -311,8 +299,7 @@
         "build obj/foo/foo_bar: rustc ../../foo/main.rs | ../../foo/source.rs "
         "../../foo/main.rs obj/bar/libmylib.rlib obj/foo/libstatic.a\n"
         "  externs = --extern mylib=obj/bar/libmylib.rlib\n"
-        "  rustdeps = -Ldependency=obj/bar -Lnative=obj/foo\n"
-        "  edition = 2018\n";
+        "  rustdeps = -Ldependency=obj/bar -Lnative=obj/foo\n";
     std::string out_str = out.str();
     EXPECT_EQ(expected, out_str) << expected << "\n" << out_str;
   }
@@ -325,7 +312,6 @@
   nonrust_only.source_types_used().Set(SourceFile::SOURCE_RS);
   nonrust_only.rust_values().set_crate_root(main);
   nonrust_only.rust_values().crate_name() = "foo_bar";
-  nonrust_only.rust_values().edition() = "2018";
   nonrust_only.private_deps().push_back(LabelTargetPair(&staticlib));
   nonrust_only.SetToolchain(setup.toolchain());
   ASSERT_TRUE(nonrust_only.OnResolved(&err));
@@ -348,8 +334,7 @@
         "\n"
         "build obj/foo/foo_bar: rustc ../../foo/main.rs | ../../foo/source.rs "
         "../../foo/main.rs obj/foo/libstatic.a\n"
-        "  rustdeps = -Lnative=obj/foo\n"
-        "  edition = 2018\n";
+        "  rustdeps = -Lnative=obj/foo\n";
     std::string out_str = out.str();
     EXPECT_EQ(expected, out_str) << expected << "\n" << out_str;
   }
@@ -379,7 +364,6 @@
   target.set_output_dir(SourceDir("//out/Debug/foo/"));
   target.rust_values().set_crate_root(main);
   target.rust_values().crate_name() = "foo_bar";
-  target.rust_values().edition() = "2018";
   target.private_deps().push_back(LabelTargetPair(&source_set));
   target.SetToolchain(setup.toolchain());
   ASSERT_TRUE(target.OnResolved(&err));
@@ -402,8 +386,7 @@
         "\n"
         "build obj/foo/foo_bar.exe: rustc ../../foo/main.rs | ../../foo/input3.rs "
         "../../foo/main.rs ../../foo/input1.rs ../../foo/input2.rs || "
-        "obj/foo/sources.stamp\n"
-        "  edition = 2018\n";
+        "obj/foo/sources.stamp\n";
     std::string out_str = out.str();
     EXPECT_EQ(expected, out_str) << out_str;
   }
@@ -422,7 +405,6 @@
   procmacro.source_types_used().Set(SourceFile::SOURCE_RS);
   procmacro.rust_values().set_crate_root(barlib);
   procmacro.rust_values().crate_name() = "mymacro";
-  procmacro.rust_values().edition() = "2018";
   procmacro.rust_values().set_crate_type(RustValues::CRATE_PROC_MACRO);
   procmacro.SetToolchain(setup.toolchain());
   ASSERT_TRUE(procmacro.OnResolved(&err));
@@ -444,8 +426,7 @@
         "target_output_name = mymacro\n"
         "\n"
         "build obj/bar/libmymacro.so: rustc ../../bar/lib.rs | "
-        "../../bar/mylib.rs ../../bar/lib.rs\n"
-        "  edition = 2018\n";
+        "../../bar/mylib.rs ../../bar/lib.rs\n";
     std::string out_str = out.str();
     EXPECT_EQ(expected, out_str) << out_str;
   }
@@ -459,7 +440,6 @@
   target.source_types_used().Set(SourceFile::SOURCE_RS);
   target.rust_values().set_crate_root(main);
   target.rust_values().crate_name() = "foo_bar";
-  target.rust_values().edition() = "2018";
   target.private_deps().push_back(LabelTargetPair(&procmacro));
   target.SetToolchain(setup.toolchain());
   ASSERT_TRUE(target.OnResolved(&err));
@@ -482,8 +462,7 @@
         "\n"
         "build obj/foo/foo_bar: rustc ../../foo/main.rs | ../../foo/source.rs "
         "../../foo/main.rs || obj/bar/libmymacro.so\n"
-        "  externs = --extern mymacro=obj/bar/libmymacro.so\n"
-        "  edition = 2018\n";
+        "  externs = --extern mymacro=obj/bar/libmymacro.so\n";
     std::string out_str = out.str();
     EXPECT_EQ(expected, out_str) << expected << "\n" << out_str;
   }
@@ -502,7 +481,6 @@
   rlib.source_types_used().Set(SourceFile::SOURCE_RS);
   rlib.rust_values().set_crate_root(barlib);
   rlib.rust_values().crate_name() = "mylib";
-  rlib.rust_values().edition() = "2018";
   rlib.SetToolchain(setup.toolchain());
   ASSERT_TRUE(rlib.OnResolved(&err));
 
@@ -524,8 +502,7 @@
         "target_output_name = mylib\n"
         "\n"
         "build obj/bar/libmylib.rlib: rustc ../../bar/lib.rs | "
-        "../../bar/mylib.rs ../../bar/lib.rs\n"
-        "  edition = 2018\n";
+        "../../bar/mylib.rs ../../bar/lib.rs\n";
     std::string out_str = out.str();
     EXPECT_EQ(expected, out_str) << out_str;
   }
@@ -546,7 +523,6 @@
   target.source_types_used().Set(SourceFile::SOURCE_RS);
   target.rust_values().set_crate_root(main);
   target.rust_values().crate_name() = "foo_bar";
-  target.rust_values().edition() = "2018";
   target.private_deps().push_back(LabelTargetPair(&group));
   target.SetToolchain(setup.toolchain());
   ASSERT_TRUE(target.OnResolved(&err));
@@ -570,8 +546,7 @@
         "build obj/foo/foo_bar: rustc ../../foo/main.rs | ../../foo/source.rs "
         "../../foo/main.rs obj/bar/libmylib.rlib || obj/baz/group.stamp\n"
         "  externs = --extern mylib=obj/bar/libmylib.rlib\n"
-        "  rustdeps = -Ldependency=obj/bar\n"
-        "  edition = 2018\n";
+        "  rustdeps = -Ldependency=obj/bar\n";
     std::string out_str = out.str();
     EXPECT_EQ(expected, out_str) << expected << "\n" << out_str;
   }
diff --git a/tools/gn/rust_substitution_type.cc b/tools/gn/rust_substitution_type.cc
index c6b8e9e..8881772 100644
--- a/tools/gn/rust_substitution_type.cc
+++ b/tools/gn/rust_substitution_type.cc
@@ -12,10 +12,9 @@
 
 const SubstitutionTypes RustSubstitutions = {
     &kRustSubstitutionCrateName,       &kRustSubstitutionCrateType,
-    &kRustSubstitutionEdition,         &kRustSubstitutionExterns,
     &kRustSubstitutionOutputExtension, &kRustSubstitutionOutputPrefix,
     &kRustSubstitutionRustDeps,        &kRustSubstitutionRustFlags,
-    &kRustSubstitutionRustEnv,
+    &kRustSubstitutionRustEnv,         &kRustSubstitutionExterns,
 };
 
 // Valid for Rust tools.
@@ -23,7 +22,6 @@
                                                  "crate_name"};
 const Substitution kRustSubstitutionCrateType = {"{{crate_type}}",
                                                  "crate_type"};
-const Substitution kRustSubstitutionEdition = {"{{edition}}", "edition"};
 const Substitution kRustSubstitutionExterns = {"{{externs}}", "externs"};
 const Substitution kRustSubstitutionOutputExtension = {
     "{{rustc_output_extension}}", "rustc_output_extension"};
@@ -38,7 +36,6 @@
          type == &SubstitutionOutputDir ||
          type == &kRustSubstitutionCrateName ||
          type == &kRustSubstitutionCrateType ||
-         type == &kRustSubstitutionEdition ||
          type == &kRustSubstitutionExterns ||
          type == &kRustSubstitutionOutputExtension ||
          type == &kRustSubstitutionOutputPrefix ||
diff --git a/tools/gn/rust_substitution_type.h b/tools/gn/rust_substitution_type.h
index 827f5d6..e9a78c4 100644
--- a/tools/gn/rust_substitution_type.h
+++ b/tools/gn/rust_substitution_type.h
@@ -16,7 +16,6 @@
 // Valid for Rust tools.
 extern const Substitution kRustSubstitutionCrateName;
 extern const Substitution kRustSubstitutionCrateType;
-extern const Substitution kRustSubstitutionEdition;
 extern const Substitution kRustSubstitutionExterns;
 extern const Substitution kRustSubstitutionOutputExtension;
 extern const Substitution kRustSubstitutionOutputPrefix;
diff --git a/tools/gn/rust_values.h b/tools/gn/rust_values.h
index ad9c5c6..4df5c5c 100644
--- a/tools/gn/rust_values.h
+++ b/tools/gn/rust_values.h
@@ -45,9 +45,6 @@
   const CrateType crate_type() const { return crate_type_; }
   void set_crate_type(CrateType s) { crate_type_ = s; }
 
-  std::string& edition() { return edition_; }
-  const std::string& edition() const { return edition_; }
-
   // Any renamed dependencies for the `extern` flags.
   const std::map<Label, std::string>& aliased_deps() const {
     return aliased_deps_;
@@ -58,7 +55,6 @@
   std::string crate_name_;
   SourceFile crate_root_;
   CrateType crate_type_ = CRATE_AUTO;
-  std::string edition_;
   std::map<Label, std::string> aliased_deps_;
 
   DISALLOW_COPY_AND_ASSIGN(RustValues);
diff --git a/tools/gn/rust_values_generator.cc b/tools/gn/rust_values_generator.cc
index c29282e..d7ebd4a 100644
--- a/tools/gn/rust_values_generator.cc
+++ b/tools/gn/rust_values_generator.cc
@@ -60,9 +60,6 @@
   if (!FillCrateRoot())
     return;
 
-  if (!FillEdition())
-    return;
-
   if (!FillAliasedDeps())
     return;
 }
@@ -165,20 +162,6 @@
   return true;
 }
 
-bool RustTargetGenerator::FillEdition() {
-  const Value* value = scope_->GetValue(variables::kRustEdition, true);
-  if (!value) {
-    *err_ = Err(function_call_, "Missing \"edition\" in Rust target.");
-    return false;
-  }
-
-  if (!value->VerifyTypeIs(Value::STRING, err_))
-    return false;
-
-  target_->rust_values().edition() = std::move(value->string_value());
-  return true;
-}
-
 bool RustTargetGenerator::FillAliasedDeps() {
   const Value* value = scope_->GetValue(variables::kRustAliasedDeps, true);
   if (!value)
diff --git a/tools/gn/rust_variables.cc b/tools/gn/rust_variables.cc
index 67018c7..f1867cb 100644
--- a/tools/gn/rust_variables.cc
+++ b/tools/gn/rust_variables.cc
@@ -95,20 +95,6 @@
   only one file.
 )";
 
-const char kRustEdition[] = "edition";
-const char kRustEdition_HelpShort[] =
-    "edition: [string] The rustc edition to use in compiliation.";
-const char kRustEdition_Help[] =
-    R"(edition: [string] The rustc edition to use in compiliation.
-
-  Valid for `rust_library` targets and `executable`, `static_library`,
-  `shared_library`, and `source_set` targets that contain Rust sources.
-
-  This indicates the compiler edition to use in compilition. Should be a value
-  like "2015" or "2018", indiicating the appropriate value to pass to the
-  `--edition=<>` flag in rustc.
-)";
-
 void InsertRustVariables(VariableInfoMap* info_map) {
   info_map->insert(std::make_pair(
       kRustAliasedDeps,
@@ -122,8 +108,6 @@
   info_map->insert(std::make_pair(
       kRustCrateRoot,
       VariableInfo(kRustCrateRoot_HelpShort, kRustCrateRoot_Help)));
-  info_map->insert(std::make_pair(
-      kRustEdition, VariableInfo(kRustEdition_HelpShort, kRustEdition_Help)));
 }
 
 }  // namespace variables
diff --git a/tools/gn/test_with_scope.cc b/tools/gn/test_with_scope.cc
index 5025420..1b9f9f4 100644
--- a/tools/gn/test_with_scope.cc
+++ b/tools/gn/test_with_scope.cc
@@ -197,7 +197,7 @@
   // RUST
   std::unique_ptr<Tool> rustc_tool = Tool::CreateTool(RustTool::kRsToolRustc);
   SetCommandForTool(
-      "{{rustenv}} rustc --edition=2018 --crate-name {{crate_name}} {{source}} "
+      "{{rustenv}} rustc --crate-name {{crate_name}} {{source}} "
       "--crate-type {{crate_type}} {{rustflags}} -o "
       "{{target_out_dir}}/"
       "{{rustc_output_prefix}}{{crate_name}}{{rustc_output_extension}} "