encoding/jsonschema: fix dropping of struct for additionalProperties: true

Fixes #734

Change-Id: I4ff1ee63d894bcc76d25bc406c52eeda59deab90
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/8781
Reviewed-by: CUE cueckoo <cueckoo@gmail.com>
Reviewed-by: Marcel van Lohuizen <mpvl@golang.org>
diff --git a/cmd/cue/cmd/testdata/script/cmd_github.txt b/cmd/cue/cmd/testdata/script/cmd_github.txt
index e180a69..77de89b 100644
--- a/cmd/cue/cmd/testdata/script/cmd_github.txt
+++ b/cmd/cue/cmd/testdata/script/cmd_github.txt
@@ -957,7 +957,9 @@
 
 	#event: "check_run" | "check_suite" | "create" | "delete" | "deployment" | "deployment_status" | "fork" | "gollum" | "issue_comment" | "issues" | "label" | "member" | "milestone" | "page_build" | "project" | "project_card" | "project_column" | "public" | "pull_request" | "pull_request_review" | "pull_request_review_comment" | "pull_request_target" | "push" | "registry_package" | "release" | "status" | "watch" | "workflow_dispatch" | "workflow_run" | "repository_dispatch"
 
-	#eventObject: null
+	#eventObject: null | {
+		...
+	}
 
 	#expressionSyntax: =~"^\\$\\{\\{.*\\}\\}$"
 
diff --git a/cue.mod/pkg/github.com/SchemaStore/schemastore/src/schemas/json/github-workflow.cue b/cue.mod/pkg/github.com/SchemaStore/schemastore/src/schemas/json/github-workflow.cue
index 013dfa2..ac72436 100644
--- a/cue.mod/pkg/github.com/SchemaStore/schemastore/src/schemas/json/github-workflow.cue
+++ b/cue.mod/pkg/github.com/SchemaStore/schemastore/src/schemas/json/github-workflow.cue
@@ -631,7 +631,9 @@
 
 	#event: "check_run" | "check_suite" | "create" | "delete" | "deployment" | "deployment_status" | "fork" | "gollum" | "issue_comment" | "issues" | "label" | "member" | "milestone" | "page_build" | "project" | "project_card" | "project_column" | "public" | "pull_request" | "pull_request_review" | "pull_request_review_comment" | "pull_request_target" | "push" | "registry_package" | "release" | "status" | "watch" | "workflow_dispatch" | "workflow_run" | "repository_dispatch"
 
-	#eventObject: null
+	#eventObject: null | {
+		...
+	}
 
 	#expressionSyntax: =~"^\\$\\{\\{.*\\}\\}$"
 
diff --git a/cue/testdata/eval/github.txtar b/cue/testdata/eval/github.txtar
index bd88e5f..1bebdb0 100644
--- a/cue/testdata/eval/github.txtar
+++ b/cue/testdata/eval/github.txtar
@@ -1020,7 +1020,9 @@
 
 	#event: "check_run" | "check_suite" | "create" | "delete" | "deployment" | "deployment_status" | "fork" | "gollum" | "issue_comment" | "issues" | "label" | "member" | "milestone" | "page_build" | "project" | "project_card" | "project_column" | "public" | "pull_request" | "pull_request_review" | "pull_request_review_comment" | "pull_request_target" | "push" | "registry_package" | "release" | "status" | "watch" | "workflow_dispatch" | "workflow_run" | "repository_dispatch"
 
-	#eventObject: null
+	#eventObject: null | {
+		...
+	}
 
 	#expressionSyntax: =~"^\\$\\{\\{.*\\}\\}$"
 
@@ -1075,7 +1077,8 @@
           name: (string){ string }
         }
         #event: (string){ |((string){ "check_run" }, (string){ "check_suite" }, (string){ "create" }, (string){ "delete" }, (string){ "deployment" }, (string){ "deployment_status" }, (string){ "fork" }, (string){ "gollum" }, (string){ "issue_comment" }, (string){ "issues" }, (string){ "label" }, (string){ "member" }, (string){ "milestone" }, (string){ "page_build" }, (string){ "project" }, (string){ "project_card" }, (string){ "project_column" }, (string){ "public" }, (string){ "pull_request" }, (string){ "pull_request_review" }, (string){ "pull_request_review_comment" }, (string){ "pull_request_target" }, (string){ "push" }, (string){ "registry_package" }, (string){ "release" }, (string){ "status" }, (string){ "watch" }, (string){ "workflow_dispatch" }, (string){ "workflow_run" }, (string){ "repository_dispatch" }) }
-        #eventObject: (null){ null }
+        #eventObject: ((null|struct)){ |((null){ null }, (#struct){
+          }) }
         #expressionSyntax: (string){ =~"^\\$\\{\\{.*\\}\\}$" }
         #globs: (list){
           0: (string){ strings.MinRunes(1) }
@@ -1305,7 +1308,8 @@
           name: (string){ string }
         }
         #event: (string){ |((string){ "check_run" }, (string){ "check_suite" }, (string){ "create" }, (string){ "delete" }, (string){ "deployment" }, (string){ "deployment_status" }, (string){ "fork" }, (string){ "gollum" }, (string){ "issue_comment" }, (string){ "issues" }, (string){ "label" }, (string){ "member" }, (string){ "milestone" }, (string){ "page_build" }, (string){ "project" }, (string){ "project_card" }, (string){ "project_column" }, (string){ "public" }, (string){ "pull_request" }, (string){ "pull_request_review" }, (string){ "pull_request_review_comment" }, (string){ "pull_request_target" }, (string){ "push" }, (string){ "registry_package" }, (string){ "release" }, (string){ "status" }, (string){ "watch" }, (string){ "workflow_dispatch" }, (string){ "workflow_run" }, (string){ "repository_dispatch" }) }
-        #eventObject: (null){ null }
+        #eventObject: ((null|struct)){ |((null){ null }, (#struct){
+          }) }
         #expressionSyntax: (string){ =~"^\\$\\{\\{.*\\}\\}$" }
         #globs: (list){
           0: (string){ strings.MinRunes(1) }
@@ -1430,7 +1434,8 @@
           name: (string){ string }
         }
         #event: (string){ |((string){ "check_run" }, (string){ "check_suite" }, (string){ "create" }, (string){ "delete" }, (string){ "deployment" }, (string){ "deployment_status" }, (string){ "fork" }, (string){ "gollum" }, (string){ "issue_comment" }, (string){ "issues" }, (string){ "label" }, (string){ "member" }, (string){ "milestone" }, (string){ "page_build" }, (string){ "project" }, (string){ "project_card" }, (string){ "project_column" }, (string){ "public" }, (string){ "pull_request" }, (string){ "pull_request_review" }, (string){ "pull_request_review_comment" }, (string){ "pull_request_target" }, (string){ "push" }, (string){ "registry_package" }, (string){ "release" }, (string){ "status" }, (string){ "watch" }, (string){ "workflow_dispatch" }, (string){ "workflow_run" }, (string){ "repository_dispatch" }) }
-        #eventObject: (null){ null }
+        #eventObject: ((null|struct)){ |((null){ null }, (#struct){
+          }) }
         #expressionSyntax: (string){ =~"^\\$\\{\\{.*\\}\\}$" }
         #globs: (list){
           0: (string){ strings.MinRunes(1) }
@@ -1559,7 +1564,8 @@
           name: (string){ string }
         }
         #event: (string){ |((string){ "check_run" }, (string){ "check_suite" }, (string){ "create" }, (string){ "delete" }, (string){ "deployment" }, (string){ "deployment_status" }, (string){ "fork" }, (string){ "gollum" }, (string){ "issue_comment" }, (string){ "issues" }, (string){ "label" }, (string){ "member" }, (string){ "milestone" }, (string){ "page_build" }, (string){ "project" }, (string){ "project_card" }, (string){ "project_column" }, (string){ "public" }, (string){ "pull_request" }, (string){ "pull_request_review" }, (string){ "pull_request_review_comment" }, (string){ "pull_request_target" }, (string){ "push" }, (string){ "registry_package" }, (string){ "release" }, (string){ "status" }, (string){ "watch" }, (string){ "workflow_dispatch" }, (string){ "workflow_run" }, (string){ "repository_dispatch" }) }
-        #eventObject: (null){ null }
+        #eventObject: ((null|struct)){ |((null){ null }, (#struct){
+          }) }
         #expressionSyntax: (string){ =~"^\\$\\{\\{.*\\}\\}$" }
         #globs: (list){
           0: (string){ strings.MinRunes(1) }
@@ -1625,7 +1631,8 @@
           name: (string){ string }
         }
         #event: (string){ |((string){ "check_run" }, (string){ "check_suite" }, (string){ "create" }, (string){ "delete" }, (string){ "deployment" }, (string){ "deployment_status" }, (string){ "fork" }, (string){ "gollum" }, (string){ "issue_comment" }, (string){ "issues" }, (string){ "label" }, (string){ "member" }, (string){ "milestone" }, (string){ "page_build" }, (string){ "project" }, (string){ "project_card" }, (string){ "project_column" }, (string){ "public" }, (string){ "pull_request" }, (string){ "pull_request_review" }, (string){ "pull_request_review_comment" }, (string){ "pull_request_target" }, (string){ "push" }, (string){ "registry_package" }, (string){ "release" }, (string){ "status" }, (string){ "watch" }, (string){ "workflow_dispatch" }, (string){ "workflow_run" }, (string){ "repository_dispatch" }) }
-        #eventObject: (null){ null }
+        #eventObject: ((null|struct)){ |((null){ null }, (#struct){
+          }) }
         #expressionSyntax: (string){ =~"^\\$\\{\\{.*\\}\\}$" }
         #globs: (list){
           0: (string){ strings.MinRunes(1) }
@@ -1699,7 +1706,8 @@
       name: (string){ string }
     }
     #event: (string){ |((string){ "check_run" }, (string){ "check_suite" }, (string){ "create" }, (string){ "delete" }, (string){ "deployment" }, (string){ "deployment_status" }, (string){ "fork" }, (string){ "gollum" }, (string){ "issue_comment" }, (string){ "issues" }, (string){ "label" }, (string){ "member" }, (string){ "milestone" }, (string){ "page_build" }, (string){ "project" }, (string){ "project_card" }, (string){ "project_column" }, (string){ "public" }, (string){ "pull_request" }, (string){ "pull_request_review" }, (string){ "pull_request_review_comment" }, (string){ "pull_request_target" }, (string){ "push" }, (string){ "registry_package" }, (string){ "release" }, (string){ "status" }, (string){ "watch" }, (string){ "workflow_dispatch" }, (string){ "workflow_run" }, (string){ "repository_dispatch" }) }
-    #eventObject: (null){ null }
+    #eventObject: ((null|struct)){ |((null){ null }, (#struct){
+      }) }
     #expressionSyntax: (string){ =~"^\\$\\{\\{.*\\}\\}$" }
     #globs: (list){
       0: (string){ strings.MinRunes(1) }
@@ -1926,7 +1934,8 @@
       name: (string){ string }
     }
     #event: (string){ |((string){ "check_run" }, (string){ "check_suite" }, (string){ "create" }, (string){ "delete" }, (string){ "deployment" }, (string){ "deployment_status" }, (string){ "fork" }, (string){ "gollum" }, (string){ "issue_comment" }, (string){ "issues" }, (string){ "label" }, (string){ "member" }, (string){ "milestone" }, (string){ "page_build" }, (string){ "project" }, (string){ "project_card" }, (string){ "project_column" }, (string){ "public" }, (string){ "pull_request" }, (string){ "pull_request_review" }, (string){ "pull_request_review_comment" }, (string){ "pull_request_target" }, (string){ "push" }, (string){ "registry_package" }, (string){ "release" }, (string){ "status" }, (string){ "watch" }, (string){ "workflow_dispatch" }, (string){ "workflow_run" }, (string){ "repository_dispatch" }) }
-    #eventObject: (null){ null }
+    #eventObject: ((null|struct)){ |((null){ null }, (#struct){
+      }) }
     #expressionSyntax: (string){ =~"^\\$\\{\\{.*\\}\\}$" }
     #globs: (list){
       0: (string){ strings.MinRunes(1) }
@@ -2048,7 +2057,8 @@
       name: (string){ string }
     }
     #event: (string){ |((string){ "check_run" }, (string){ "check_suite" }, (string){ "create" }, (string){ "delete" }, (string){ "deployment" }, (string){ "deployment_status" }, (string){ "fork" }, (string){ "gollum" }, (string){ "issue_comment" }, (string){ "issues" }, (string){ "label" }, (string){ "member" }, (string){ "milestone" }, (string){ "page_build" }, (string){ "project" }, (string){ "project_card" }, (string){ "project_column" }, (string){ "public" }, (string){ "pull_request" }, (string){ "pull_request_review" }, (string){ "pull_request_review_comment" }, (string){ "pull_request_target" }, (string){ "push" }, (string){ "registry_package" }, (string){ "release" }, (string){ "status" }, (string){ "watch" }, (string){ "workflow_dispatch" }, (string){ "workflow_run" }, (string){ "repository_dispatch" }) }
-    #eventObject: (null){ null }
+    #eventObject: ((null|struct)){ |((null){ null }, (#struct){
+      }) }
     #expressionSyntax: (string){ =~"^\\$\\{\\{.*\\}\\}$" }
     #globs: (list){
       0: (string){ strings.MinRunes(1) }
@@ -2120,7 +2130,8 @@
       name: (string){ string }
     }
     #event: (string){ |((string){ "check_run" }, (string){ "check_suite" }, (string){ "create" }, (string){ "delete" }, (string){ "deployment" }, (string){ "deployment_status" }, (string){ "fork" }, (string){ "gollum" }, (string){ "issue_comment" }, (string){ "issues" }, (string){ "label" }, (string){ "member" }, (string){ "milestone" }, (string){ "page_build" }, (string){ "project" }, (string){ "project_card" }, (string){ "project_column" }, (string){ "public" }, (string){ "pull_request" }, (string){ "pull_request_review" }, (string){ "pull_request_review_comment" }, (string){ "pull_request_target" }, (string){ "push" }, (string){ "registry_package" }, (string){ "release" }, (string){ "status" }, (string){ "watch" }, (string){ "workflow_dispatch" }, (string){ "workflow_run" }, (string){ "repository_dispatch" }) }
-    #eventObject: (null){ null }
+    #eventObject: ((null|struct)){ |((null){ null }, (#struct){
+      }) }
     #expressionSyntax: (string){ =~"^\\$\\{\\{.*\\}\\}$" }
     #globs: (list){
       0: (string){ strings.MinRunes(1) }
@@ -2246,7 +2257,8 @@
       name: (string){ string }
     }
     #event: (string){ |((string){ "check_run" }, (string){ "check_suite" }, (string){ "create" }, (string){ "delete" }, (string){ "deployment" }, (string){ "deployment_status" }, (string){ "fork" }, (string){ "gollum" }, (string){ "issue_comment" }, (string){ "issues" }, (string){ "label" }, (string){ "member" }, (string){ "milestone" }, (string){ "page_build" }, (string){ "project" }, (string){ "project_card" }, (string){ "project_column" }, (string){ "public" }, (string){ "pull_request" }, (string){ "pull_request_review" }, (string){ "pull_request_review_comment" }, (string){ "pull_request_target" }, (string){ "push" }, (string){ "registry_package" }, (string){ "release" }, (string){ "status" }, (string){ "watch" }, (string){ "workflow_dispatch" }, (string){ "workflow_run" }, (string){ "repository_dispatch" }) }
-    #eventObject: (null){ null }
+    #eventObject: ((null|struct)){ |((null){ null }, (#struct){
+      }) }
     #expressionSyntax: (string){ =~"^\\$\\{\\{.*\\}\\}$" }
     #globs: (list){
       0: (string){ strings.MinRunes(1) }
@@ -2309,7 +2321,8 @@
       name: (string){ string }
     }
     #event: (string){ |((string){ "check_run" }, (string){ "check_suite" }, (string){ "create" }, (string){ "delete" }, (string){ "deployment" }, (string){ "deployment_status" }, (string){ "fork" }, (string){ "gollum" }, (string){ "issue_comment" }, (string){ "issues" }, (string){ "label" }, (string){ "member" }, (string){ "milestone" }, (string){ "page_build" }, (string){ "project" }, (string){ "project_card" }, (string){ "project_column" }, (string){ "public" }, (string){ "pull_request" }, (string){ "pull_request_review" }, (string){ "pull_request_review_comment" }, (string){ "pull_request_target" }, (string){ "push" }, (string){ "registry_package" }, (string){ "release" }, (string){ "status" }, (string){ "watch" }, (string){ "workflow_dispatch" }, (string){ "workflow_run" }, (string){ "repository_dispatch" }) }
-    #eventObject: (null){ null }
+    #eventObject: ((null|struct)){ |((null){ null }, (#struct){
+      }) }
     #expressionSyntax: (string){ =~"^\\$\\{\\{.*\\}\\}$" }
     #globs: (list){
       0: (string){ strings.MinRunes(1) }
diff --git a/encoding/jsonschema/constraints.go b/encoding/jsonschema/constraints.go
index ef941e2..2b9e1ec 100644
--- a/encoding/jsonschema/constraints.go
+++ b/encoding/jsonschema/constraints.go
@@ -596,9 +596,6 @@
 		switch n.Kind() {
 		case cue.BoolKind:
 			s.closeStruct = !s.boolValue(n)
-			if !s.closeStruct {
-				s.usedTypes |= cue.StructKind
-			}
 
 		case cue.StructKind:
 			s.usedTypes |= cue.StructKind
diff --git a/encoding/jsonschema/decode_test.go b/encoding/jsonschema/decode_test.go
index 9912cd8..252ae28 100644
--- a/encoding/jsonschema/decode_test.go
+++ b/encoding/jsonschema/decode_test.go
@@ -34,6 +34,7 @@
 	"cuelang.org/go/cue/token"
 	"cuelang.org/go/encoding/json"
 	"cuelang.org/go/encoding/yaml"
+	"cuelang.org/go/internal"
 	"cuelang.org/go/internal/cuetest"
 	_ "cuelang.org/go/pkg"
 )
@@ -148,3 +149,38 @@
 	})
 	assert.NoError(t, err)
 }
+
+func TestX(t *testing.T) {
+	t.Skip()
+	data := `
+-- schema.json --
+`
+
+	a := txtar.Parse([]byte(data))
+
+	r := &cue.Runtime{}
+	var in *cue.Instance
+	var err error
+	for _, f := range a.Files {
+		switch path.Ext(f.Name) {
+		case ".json":
+			in, err = json.Decode(r, f.Name, f.Data)
+			if err != nil {
+				t.Fatal(err)
+			}
+		case ".yaml":
+			in, err = yaml.Decode(r, f.Name, f.Data)
+			if err != nil {
+				t.Fatal(err)
+			}
+		}
+	}
+
+	cfg := &Config{ID: "test"}
+	expr, err := Extract(in, cfg)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	t.Fatal(internal.DebugStr(expr))
+}
diff --git a/encoding/jsonschema/testdata/emptyobj.txtar b/encoding/jsonschema/testdata/emptyobj.txtar
new file mode 100644
index 0000000..61ddea1
--- /dev/null
+++ b/encoding/jsonschema/testdata/emptyobj.txtar
@@ -0,0 +1,36 @@
+// Objects without properties should convert correctly.
+//
+// Issue #734
+-- github-workflow.json --
+{
+  "$schema": "http://json-schema.org/draft-07/schema",
+  "definitions": {
+    "obj1": {
+      "oneOf": [
+        {
+          "type": "object"
+        },
+        {
+          "type": "null"
+        }
+      ],
+      "additionalProperties": true
+    },
+    "obj2": {
+      "type": [ "object", "null" ],
+      "additionalProperties": true
+    }
+  }
+}
+-- out.err --
+-- out.cue --
+@jsonschema(schema="http://json-schema.org/draft-07/schema")
+_
+
+#obj1: null | {
+	...
+}
+
+#obj2: null | {
+	...
+}
diff --git a/encoding/jsonschema/testdata/github.txtar b/encoding/jsonschema/testdata/github.txtar
index e644d9f..69699f9 100644
--- a/encoding/jsonschema/testdata/github.txtar
+++ b/encoding/jsonschema/testdata/github.txtar
@@ -1972,7 +1972,9 @@
 
 #event: "check_run" | "check_suite" | "create" | "delete" | "deployment" | "deployment_status" | "fork" | "gollum" | "issue_comment" | "issues" | "label" | "member" | "milestone" | "page_build" | "project" | "project_card" | "project_column" | "public" | "pull_request" | "pull_request_review" | "pull_request_review_comment" | "pull_request_target" | "push" | "registry_package" | "release" | "status" | "watch" | "workflow_dispatch" | "workflow_run" | "repository_dispatch"
 
-#eventObject: null
+#eventObject: null | {
+	...
+}
 
 #expressionSyntax: =~"^\\$\\{\\{.*\\}\\}$"