diff --git a/rust/project_json.go b/rust/project_json.go index faa7db5f7..ae48312b5 100644 --- a/rust/project_json.go +++ b/rust/project_json.go @@ -51,6 +51,7 @@ type rustProjectCrate struct { Deps []rustProjectDep `json:"deps"` Cfg []string `json:"cfg"` Env map[string]string `json:"env"` + ProcMacro bool `json:"is_proc_macro"` } type rustProjectJson struct { @@ -208,6 +209,8 @@ func isModuleSupported(ctx android.SingletonContext, module android.Module) (*Mo comp = c.baseCompiler case *testDecorator: comp = c.binaryDecorator.baseCompiler + case *procMacroDecorator: + comp = c.baseCompiler default: return nil, nil, false } @@ -224,6 +227,8 @@ func (singleton *projectGeneratorSingleton) addCrate(ctx android.SingletonContex return 0, false } + _, procMacro := rModule.compiler.(*procMacroDecorator) + crate := rustProjectCrate{ DisplayName: rModule.Name(), RootModule: rootModule, @@ -231,6 +236,7 @@ func (singleton *projectGeneratorSingleton) addCrate(ctx android.SingletonContex Deps: make([]rustProjectDep, 0), Cfg: make([]string, 0), Env: make(map[string]string), + ProcMacro: procMacro, } if comp.CargoOutDir().Valid() { diff --git a/rust/project_json_test.go b/rust/project_json_test.go index f7b668122..255b2e537 100644 --- a/rust/project_json_test.go +++ b/rust/project_json_test.go @@ -117,6 +117,58 @@ func TestProjectJsonDep(t *testing.T) { validateJsonCrates(t, jsonContent) } +func TestProjectJsonProcMacroDep(t *testing.T) { + bp := ` + rust_proc_macro { + name: "libproc_macro", + srcs: ["a/src/lib.rs"], + crate_name: "proc_macro" + } + rust_library { + name: "librust", + srcs: ["b/src/lib.rs"], + crate_name: "rust", + proc_macros: ["libproc_macro"], + } + ` + jsonContent := testProjectJson(t, bp) + crates := validateJsonCrates(t, jsonContent) + libproc_macro_count := 0 + librust_count := 0 + for _, c := range crates { + crate := validateCrate(t, c) + procMacro, ok := crate["is_proc_macro"].(bool) + if !ok { + t.Fatalf("Unexpected type for is_proc_macro: %v", crate["is_proc_macro"]) + } + + name, ok := crate["display_name"].(string) + if !ok { + t.Fatalf("Unexpected type for display_name: %v", crate["display_name"]) + } + + switch name { + case "libproc_macro": + libproc_macro_count += 1 + if !procMacro { + t.Fatalf("'libproc_macro' is marked with is_proc_macro=false") + } + case "librust": + librust_count += 1 + if procMacro { + t.Fatalf("'librust' is not a proc macro crate, but is marked with is_proc_macro=true") + } + default: + break + } + } + + if libproc_macro_count != 1 || librust_count != 1 { + t.Fatalf("Unexpected crate counts: libproc_macro_count: %v, librust_count: %v", + libproc_macro_count, librust_count) + } +} + func TestProjectJsonFeature(t *testing.T) { bp := ` rust_library {