From 09c44616a0c651ba1a1e9d02bf44f0b0df2ef92f Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Tue, 14 Jan 2025 10:04:05 +0000 Subject: [PATCH 1/6] Rename "named type" to "defined type" --- go/extractor/dbscheme/tables.go | 20 ++++++++-------- go/extractor/extractor.go | 24 +++++++++---------- go/extractor/trap/labels.go | 6 ++--- .../snippets/incompleteswitchoverenum.ql | 2 +- go/ql/lib/semmle/go/Decls.qll | 2 +- go/ql/lib/semmle/go/Scopes.qll | 15 +++++++----- go/ql/lib/semmle/go/Types.qll | 21 +++++++++------- go/ql/lib/semmle/go/frameworks/GoMicro.qll | 21 +++++++++------- go/ql/lib/semmle/go/frameworks/Twirp.qll | 23 ++++++++++-------- .../AllocationSizeOverflowCustomizations.qll | 2 +- .../LengthComparisonOffByOne.ql | 2 +- .../CWE-020/IncompleteUrlSchemeCheck.ql | 2 +- .../CWE-322/InsecureHostKeyCallback.ql | 4 ++-- .../experimental/Unsafe/WrongUsageOfUnsafe.ql | 2 +- .../test/extractor-tests/go1.14/interfaces.ql | 2 +- .../GenericTypeInstantiationExpr.expected | 2 +- .../semmle/go/Types/InterfaceMethodIds.ql | 6 ++--- .../semmle/go/Types/MethodTypes.expected | 2 +- .../semmle/go/Types/MethodTypes.ql | 2 +- .../semmle/go/Types/QualifiedNames.expected | 2 +- .../semmle/go/Types/StructFields.ql | 6 ++--- .../semmle/go/Types/Types.expected | 2 +- .../library-tests/semmle/go/Types/aliases.go | 2 +- .../library-tests/semmle/go/Types/generic.go | 4 ++-- .../semmle/go/frameworks/Twirp/tests.ql | 4 ++-- 25 files changed, 96 insertions(+), 84 deletions(-) diff --git a/go/extractor/dbscheme/tables.go b/go/extractor/dbscheme/tables.go index aa44c6248424..f929e79793bc 100644 --- a/go/extractor/dbscheme/tables.go +++ b/go/extractor/dbscheme/tables.go @@ -694,13 +694,13 @@ var BuiltinObjectType = NewUnionType("@builtinobject") // PkgObjectType is the type of imported packages var PkgObjectType = ObjectKind.NewBranch("@pkgobject") -// TypeObjectType is the type of declared or built-in named types +// TypeObjectType is the type of named types (predeclared types, defined types, type parameters and aliases which refer to those things) var TypeObjectType = NewUnionType("@typeobject") -// DeclTypeObjectType is the type of declared named types +// DeclTypeObjectType is the type of defined types, type parameters and aliases which refer to named types var DeclTypeObjectType = ObjectKind.NewBranch("@decltypeobject", TypeObjectType, DeclObjectType, TypeParamParentObjectType) -// BuiltinTypeObjectType is the type of built-in named types +// BuiltinTypeObjectType is the type of built-in types (predeclared types) var BuiltinTypeObjectType = ObjectKind.NewBranch("@builtintypeobject", TypeObjectType, BuiltinObjectType) // ValueObjectType is the type of declared or built-in variables or constants @@ -855,8 +855,8 @@ var ChanTypes = map[gotypes.ChanDir]*BranchType{ gotypes.SendRecv: TypeKind.NewBranch("@sendrcvchantype", ChanType), } -// NamedType is the type of named types -var NamedType = TypeKind.NewBranch("@namedtype", CompositeType) +// DefinedType is the type of defined types +var DefinedType = TypeKind.NewBranch("@namedtype", CompositeType) // TypeSetLiteral is the type of type set literals var TypeSetLiteral = TypeKind.NewBranch("@typesetliteraltype", CompositeType) @@ -1080,10 +1080,10 @@ var FieldStructsTable = NewTable("fieldstructs", EntityColumn(StructType, "struct"), ) -// MethodHostsTable maps interface methods to the named type they belong to +// MethodHostsTable maps interface methods to the defined type they belong to var MethodHostsTable = NewTable("methodhosts", EntityColumn(ObjectType, "method"), - EntityColumn(NamedType, "host"), + EntityColumn(DefinedType, "host"), ) // DefsTable maps identifiers to the objects they define @@ -1110,7 +1110,7 @@ var TypeOfTable = NewTable("type_of", EntityColumn(TypeType, "tp"), ) -// TypeNameTable is the table associating named types with their names +// TypeNameTable is the table associating defined types with their names var TypeNameTable = NewTable("typename", EntityColumn(TypeType, "tp").Unique(), StringColumn("name"), @@ -1135,10 +1135,10 @@ var BaseTypeTable = NewTable("base_type", EntityColumn(TypeType, "tp"), ) -// UnderlyingTypeTable is the table associating named types with their +// UnderlyingTypeTable is the table associating defined types with their // underlying type var UnderlyingTypeTable = NewTable("underlying_type", - EntityColumn(NamedType, "named").Unique(), + EntityColumn(DefinedType, "named").Unique(), EntityColumn(TypeType, "tp"), ) diff --git a/go/extractor/extractor.go b/go/extractor/extractor.go index d09717fac4f6..f687f54c9777 100644 --- a/go/extractor/extractor.go +++ b/go/extractor/extractor.go @@ -475,7 +475,7 @@ func extractObjects(tw *trap.Writer, scope *types.Scope, scopeLabel trap.Label) populateTypeParamParents(funcObj.Type().(*types.Signature).TypeParams(), obj) populateTypeParamParents(funcObj.Type().(*types.Signature).RecvTypeParams(), obj) } - // Populate type parameter parents for named types. + // Populate type parameter parents for defined types and alias types. if typeNameObj, ok := obj.(*types.TypeName); ok { // `types.TypeName` represents a type with a name: a defined // type, an alias type, a type parameter, or a predeclared @@ -574,7 +574,7 @@ func extractObject(tw *trap.Writer, obj types.Object, lbl trap.Label) { // For more information on objects, see: // https://github.com/golang/example/blob/master/gotypes/README.md#objects func extractObjectTypes(tw *trap.Writer) { - // calling `extractType` on a named type will extract all methods defined + // calling `extractType` on a defined type will extract all methods defined // on it, which will add new objects. Therefore we need to do this first // before we loop over all objects and emit them. changed := true @@ -1695,7 +1695,7 @@ func extractType(tw *trap.Writer, tp types.Type) trap.Label { extractElementType(tw, lbl, tp.Elem()) case *types.Named: origintp := tp.Origin() - kind = dbscheme.NamedType.Index() + kind = dbscheme.DefinedType.Index() dbscheme.TypeNameTable.Emit(tw, lbl, origintp.Obj().Name()) underlying := origintp.Underlying() extractUnderlyingType(tw, lbl, underlying) @@ -1767,9 +1767,9 @@ func extractType(tw *trap.Writer, tp types.Type) trap.Label { // Type labels refer to global keys to ensure that if the same type is // encountered during the extraction of different files it is still ultimately // mapped to the same entity. In particular, this means that keys for compound -// types refer to the labels of their component types. For named types, the key +// types refer to the labels of their component types. For defined types, the key // is constructed from their globally unique ID. This prevents cyclic type keys -// since type recursion in Go always goes through named types. +// since type recursion in Go always goes through defined types. func getTypeLabel(tw *trap.Writer, tp types.Type) (trap.Label, bool) { tp = resolveTypeAlias(tp) lbl, exists := tw.Labeler.TypeLabels[tp] @@ -1874,12 +1874,12 @@ func getTypeLabel(tw *trap.Writer, tp types.Type) (trap.Label, bool) { origintp := tp.Origin() entitylbl, exists := tw.Labeler.LookupObjectID(origintp.Obj(), lbl) if entitylbl == trap.InvalidLabel { - panic(fmt.Sprintf("Cannot construct label for named type %v (underlying object is %v).\n", origintp, origintp.Obj())) + panic(fmt.Sprintf("Cannot construct label for defined type %v (underlying object is %v).\n", origintp, origintp.Obj())) } if !exists { extractObject(tw, origintp.Obj(), entitylbl) } - lbl = tw.Labeler.GlobalID(fmt.Sprintf("{%s};namedtype", entitylbl)) + lbl = tw.Labeler.GlobalID(fmt.Sprintf("{%s};definedtype", entitylbl)) case *types.TypeParam: parentlbl := getTypeParamParentLabel(tw, tp) idx := tp.Index() @@ -1921,9 +1921,9 @@ func extractBaseType(tw *trap.Writer, ptr trap.Label, base types.Type) { } // extractUnderlyingType extracts `underlying` as the underlying type of the -// named type `named` -func extractUnderlyingType(tw *trap.Writer, named trap.Label, underlying types.Type) { - dbscheme.UnderlyingTypeTable.Emit(tw, named, extractType(tw, underlying)) +// defined type `defined` +func extractUnderlyingType(tw *trap.Writer, defined trap.Label, underlying types.Type) { + dbscheme.UnderlyingTypeTable.Emit(tw, defined, extractType(tw, underlying)) } // extractComponentType extracts `component` as the `idx`th component type of `parent` with name `name` @@ -2173,8 +2173,8 @@ func checkObjectNotSpecialized(obj types.Object) { log.Fatalf("Encountered unexpected specialization %s of generic variable object %s", varObj.String(), varObj.Origin().String()) } if typeNameObj, ok := obj.(*types.TypeName); ok { - if namedType, ok := typeNameObj.Type().(*types.Named); ok && namedType != namedType.Origin() { - log.Fatalf("Encountered type object for specialization %s of named type %s", namedType.String(), namedType.Origin().String()) + if definedType, ok := typeNameObj.Type().(*types.Named); ok && definedType != definedType.Origin() { + log.Fatalf("Encountered type object for specialization %s of defined type %s", definedType.String(), definedType.Origin().String()) } } } diff --git a/go/extractor/trap/labels.go b/go/extractor/trap/labels.go index 6052149c183d..79ac9192e026 100644 --- a/go/extractor/trap/labels.go +++ b/go/extractor/trap/labels.go @@ -181,9 +181,9 @@ func findMethodWithGivenReceiver(object types.Object) *types.Func { // findMethodWithGivenReceiver finds a method on type `tp` with `object` as its receiver, if one exists func findMethodOnTypeWithGivenReceiver(tp types.Type, object types.Object) *types.Func { - if namedType, ok := tp.(*types.Named); ok { - for i := 0; i < namedType.NumMethods(); i++ { - meth := namedType.Method(i) + if definedType, ok := tp.(*types.Named); ok { + for i := 0; i < definedType.NumMethods(); i++ { + meth := definedType.Method(i) if object == meth.Type().(*types.Signature).Recv() { return meth } diff --git a/go/ql/examples/snippets/incompleteswitchoverenum.ql b/go/ql/examples/snippets/incompleteswitchoverenum.ql index 1ded8d0a1ab1..4777b26386a3 100644 --- a/go/ql/examples/snippets/incompleteswitchoverenum.ql +++ b/go/ql/examples/snippets/incompleteswitchoverenum.ql @@ -9,7 +9,7 @@ import go -from ExpressionSwitchStmt ss, DeclaredConstant c, NamedType t +from ExpressionSwitchStmt ss, DeclaredConstant c, DefinedType t where t.getUnderlyingType() instanceof IntegerType and t = ss.getExpr().getType() and diff --git a/go/ql/lib/semmle/go/Decls.qll b/go/ql/lib/semmle/go/Decls.qll index 6c66b085575b..785a09b25499 100644 --- a/go/ql/lib/semmle/go/Decls.qll +++ b/go/ql/lib/semmle/go/Decls.qll @@ -212,7 +212,7 @@ class MethodDecl extends FuncDecl { * * is `Rectangle`. */ - NamedType getReceiverBaseType() { result = lookThroughPointerType(this.getReceiverType()) } + DefinedType getReceiverBaseType() { result = lookThroughPointerType(this.getReceiverType()) } /** * Gets the receiver variable of this method. diff --git a/go/ql/lib/semmle/go/Scopes.qll b/go/ql/lib/semmle/go/Scopes.qll index c3671c74b5cd..0ca97acf86ce 100644 --- a/go/ql/lib/semmle/go/Scopes.qll +++ b/go/ql/lib/semmle/go/Scopes.qll @@ -194,19 +194,22 @@ class BuiltinEntity extends Entity, @builtinobject { } /** An imported package. */ class PackageEntity extends Entity, @pkgobject { } -/** A built-in or declared named type. */ +/** + * A named type (predeclared types, defined types, type parameters and aliases + * which refer to those things). + */ class TypeEntity extends Entity, @typeobject { } /** The parent of a type parameter type, either a declared type or a declared function. */ class TypeParamParentEntity extends Entity, @typeparamparentobject { } -/** A declared named type. */ +/** A named type which has a declaration. */ class DeclaredType extends TypeEntity, DeclaredEntity, TypeParamParentEntity, @decltypeobject { /** Gets the declaration specifier declaring this type. */ TypeSpec getSpec() { result.getNameExpr() = this.getDeclaration() } } -/** A built-in named type. */ +/** A built-in type. */ class BuiltinType extends TypeEntity, BuiltinEntity, @builtintypeobject { } /** A built-in or declared constant, variable, field, method or function. */ @@ -522,7 +525,7 @@ class Method extends Function { Type getReceiverBaseType() { result = lookThroughPointerType(this.getReceiverType()) } /** Holds if this method has name `m` and belongs to the method set of type `tp` or `*tp`. */ - private predicate isIn(NamedType tp, string m) { + private predicate isIn(DefinedType tp, string m) { this = tp.getMethod(m) or this = tp.getPointerType().getMethod(m) } @@ -536,7 +539,7 @@ class Method extends Function { * distinguishes between the method sets of `T` and `*T`, while the former does not. */ override predicate hasQualifiedName(string tp, string m) { - exists(NamedType t | + exists(DefinedType t | this.isIn(t, m) and tp = t.getQualifiedName() ) @@ -552,7 +555,7 @@ class Method extends Function { */ pragma[nomagic] predicate hasQualifiedName(string pkg, string tp, string m) { - exists(NamedType t | + exists(DefinedType t | this.isIn(t, m) and t.hasQualifiedName(pkg, tp) ) diff --git a/go/ql/lib/semmle/go/Types.qll b/go/ql/lib/semmle/go/Types.qll index 1f1234aa1ded..4ba604a9a08a 100644 --- a/go/ql/lib/semmle/go/Types.qll +++ b/go/ql/lib/semmle/go/Types.qll @@ -26,7 +26,7 @@ class Type extends @type { /** * Gets the qualified name of this type, if any. * - * Only (defined) named types like `io.Writer` have a qualified name. Basic types like `int`, + * Only defined types like `io.Writer` have a qualified name. Basic types like `int`, * pointer types like `*io.Writer`, and other composite types do not have a qualified name. */ string getQualifiedName() { result = this.getEntity().getQualifiedName() } @@ -34,7 +34,7 @@ class Type extends @type { /** * Holds if this type is declared in a package with path `pkg` and has name `name`. * - * Only (defined) named types like `io.Writer` have a qualified name. Basic types like `int`, + * Only defined types like `io.Writer` have a qualified name. Basic types like `int`, * pointer types like `*io.Writer`, and other composite types do not have a qualified name. */ predicate hasQualifiedName(string pkg, string name) { @@ -50,7 +50,7 @@ class Type extends @type { * Gets the method `m` belonging to the method set of this type, if any. * * Note that this predicate never has a result for struct types. Methods are associated - * with the corresponding named type instead. + * with the corresponding defined type instead. */ Method getMethod(string m) { result.getReceiverType() = this and @@ -446,7 +446,7 @@ class StructType extends @structtype, CompositeType { if n = "" then ( isEmbedded = true and - name = lookThroughPointerType(tp).(NamedType).getName() + name = lookThroughPointerType(tp).(DefinedType).getName() ) else ( isEmbedded = false and name = n @@ -497,7 +497,7 @@ class StructType extends @structtype, CompositeType { // embeddedParent is a field of 'this' at depth 'depth - 1' this.hasFieldCand(_, embeddedParent, depth - 1, true) and // embeddedParent's type has the result field. Note that it is invalid Go - // to have an embedded field with a named type whose underlying type is a + // to have an embedded field with a defined type whose underlying type is a // pointer, so we don't have to have // `lookThroughPointerType(embeddedParent.getType().getUnderlyingType())`. result = @@ -613,7 +613,7 @@ class PointerType extends @pointertype, CompositeType { or // promoted methods from embedded types exists(StructType s, Type embedded | - s = this.getBaseType().(NamedType).getUnderlyingType() and + s = this.getBaseType().(DefinedType).getUnderlyingType() and s.hasOwnField(_, _, embedded, true) and // ensure that `m` can be promoted not s.hasOwnField(_, m, _, _) and @@ -918,7 +918,7 @@ class EmptyInterfaceType extends BasicInterfaceType { /** * The predeclared `comparable` type. */ -class ComparableType extends NamedType { +class ComparableType extends DefinedType { ComparableType() { this.getName() = "comparable" } } @@ -1028,8 +1028,11 @@ class SendRecvChanType extends @sendrcvchantype, ChanType { override string toString() { result = "send-receive-channel type" } } -/** A named type. */ -class NamedType extends @namedtype, CompositeType { +/** DEPRECATED: Use `DefinedType` instead. */ +deprecated class NamedType = DefinedType; + +/** A defined type. */ +class DefinedType extends @namedtype, CompositeType { /** Gets the type which this type is defined to be. */ Type getBaseType() { underlying_type(this, result) } diff --git a/go/ql/lib/semmle/go/frameworks/GoMicro.qll b/go/ql/lib/semmle/go/frameworks/GoMicro.qll index 116ebee030ea..b10cca793368 100644 --- a/go/ql/lib/semmle/go/frameworks/GoMicro.qll +++ b/go/ql/lib/semmle/go/frameworks/GoMicro.qll @@ -47,28 +47,31 @@ module GoMicro { * A Server Interface type. */ class ServiceInterfaceType extends InterfaceType { - NamedType namedType; + DefinedType definedType; ServiceInterfaceType() { - this = namedType.getUnderlyingType() and - namedType.hasLocationInfo(any(ProtocGeneratedFile f).getAbsolutePath(), _, _, _, _) + this = definedType.getUnderlyingType() and + definedType.hasLocationInfo(any(ProtocGeneratedFile f).getAbsolutePath(), _, _, _, _) } /** * Gets the name of the interface. */ - override string getName() { result = namedType.getName() } + override string getName() { result = definedType.getName() } + + /** DEPRECATED: Use `getDefinedType` instead. */ + deprecated DefinedType getNamedType() { result = definedType } /** - * Gets the named type on top of this interface type. + * Gets the defined type on top of this interface type. */ - NamedType getNamedType() { result = namedType } + DefinedType getDefinedType() { result = definedType } } /** * A Service server handler type. */ - class ServiceServerType extends NamedType { + class ServiceServerType extends DefinedType { ServiceServerType() { this.implements(any(ServiceInterfaceType i)) and this.getName().regexpMatch("(?i).*Handler") and @@ -79,7 +82,7 @@ module GoMicro { /** * A Client server handler type. */ - class ClientServiceType extends NamedType { + class ClientServiceType extends DefinedType { ClientServiceType() { this.implements(any(ServiceInterfaceType i)) and this.getName().regexpMatch("(?i).*Service") and @@ -101,7 +104,7 @@ module GoMicro { bindingset[m] pragma[inline_late] private predicate implementsServiceType(Method m) { - m.implements(any(ServiceInterfaceType i).getNamedType().getMethod(_)) + m.implements(any(ServiceInterfaceType i).getDefinedType().getMethod(_)) } /** diff --git a/go/ql/lib/semmle/go/frameworks/Twirp.qll b/go/ql/lib/semmle/go/frameworks/Twirp.qll index 7f338816b383..10c8106f4017 100644 --- a/go/ql/lib/semmle/go/frameworks/Twirp.qll +++ b/go/ql/lib/semmle/go/frameworks/Twirp.qll @@ -44,22 +44,25 @@ module Twirp { /** An interface type representing a Twirp service. */ class ServiceInterfaceType extends InterfaceType { - NamedType namedType; + DefinedType definedType; ServiceInterfaceType() { - namedType.getUnderlyingType() = this and - namedType.hasLocationInfo(any(ServicesGeneratedFile f).getAbsolutePath(), _, _, _, _) + definedType.getUnderlyingType() = this and + definedType.hasLocationInfo(any(ServicesGeneratedFile f).getAbsolutePath(), _, _, _, _) } /** Gets the name of the interface. */ - override string getName() { result = namedType.getName() } + override string getName() { result = definedType.getName() } - /** Gets the named type on top of this interface type. */ - NamedType getNamedType() { result = namedType } + /** DEPRECATED: Use `getDefinedType` instead. */ + deprecated DefinedType getNamedType() { result = this.getDefinedType() } + + /** Gets the defined type on top of this interface type. */ + DefinedType getDefinedType() { result = definedType } } /** A Twirp client. */ - class ServiceClientType extends NamedType { + class ServiceClientType extends DefinedType { ServiceClientType() { exists(ServiceInterfaceType i, PointerType p | p.implements(i) and @@ -71,7 +74,7 @@ module Twirp { } /** A Twirp server. */ - class ServiceServerType extends NamedType { + class ServiceServerType extends DefinedType { ServiceServerType() { exists(ServiceInterfaceType i | this.implements(i) and @@ -99,7 +102,7 @@ module Twirp { class ServerConstructor extends Function { ServerConstructor() { this.getName().regexpMatch("(?i)new" + any(ServiceServerType c).getName()) and - this.getParameterType(0) = any(ServiceInterfaceType i).getNamedType() and + this.getParameterType(0) = any(ServiceInterfaceType i).getDefinedType() and this.hasLocationInfo(any(ServicesGeneratedFile f).getAbsolutePath(), _, _, _, _) } } @@ -121,7 +124,7 @@ module Twirp { bindingset[m] pragma[inline_late] private predicate implementsServiceType(Method m) { - m.implements(any(ServiceInterfaceType i).getNamedType().getMethod(_)) + m.implements(any(ServiceInterfaceType i).getDefinedType().getMethod(_)) } /** A service handler. */ diff --git a/go/ql/lib/semmle/go/security/AllocationSizeOverflowCustomizations.qll b/go/ql/lib/semmle/go/security/AllocationSizeOverflowCustomizations.qll index 13c76a9566a6..60841b048f43 100644 --- a/go/ql/lib/semmle/go/security/AllocationSizeOverflowCustomizations.qll +++ b/go/ql/lib/semmle/go/security/AllocationSizeOverflowCustomizations.qll @@ -157,7 +157,7 @@ module AllocationSizeOverflow { t instanceof BasicType and not t instanceof StringType or - isSmallType(t.(NamedType).getUnderlyingType()) + isSmallType(t.(DefinedType).getUnderlyingType()) or isSmallType(t.(PointerType).getBaseType()) or diff --git a/go/ql/src/InconsistentCode/LengthComparisonOffByOne.ql b/go/ql/src/InconsistentCode/LengthComparisonOffByOne.ql index fbb1965c5f62..05a468b85179 100644 --- a/go/ql/src/InconsistentCode/LengthComparisonOffByOne.ql +++ b/go/ql/src/InconsistentCode/LengthComparisonOffByOne.ql @@ -70,7 +70,7 @@ predicate elementRead( } predicate isRegexpMethodCall(DataFlow::MethodCallNode c) { - exists(NamedType regexp, Type recvtp | + exists(DefinedType regexp, Type recvtp | regexp.getName() = "Regexp" and recvtp = c.getReceiver().getType() | lookThroughPointerType(recvtp) = regexp diff --git a/go/ql/src/Security/CWE-020/IncompleteUrlSchemeCheck.ql b/go/ql/src/Security/CWE-020/IncompleteUrlSchemeCheck.ql index 99513825892e..37912437a582 100644 --- a/go/ql/src/Security/CWE-020/IncompleteUrlSchemeCheck.ql +++ b/go/ql/src/Security/CWE-020/IncompleteUrlSchemeCheck.ql @@ -22,7 +22,7 @@ class DangerousScheme extends string { /** Gets a data-flow node that checks an instance of `g` against the given `scheme`. */ DataFlow::Node schemeCheck(GVN g, DangerousScheme scheme) { // check of the form `nd.Scheme == scheme` - exists(NamedType url, DataFlow::FieldReadNode fr, DataFlow::Node s | + exists(DefinedType url, DataFlow::FieldReadNode fr, DataFlow::Node s | url.hasQualifiedName("net/url", "URL") and fr.readsField(g.getANode(), url.getField("Scheme")) and s.getStringValue() = scheme and diff --git a/go/ql/src/Security/CWE-322/InsecureHostKeyCallback.ql b/go/ql/src/Security/CWE-322/InsecureHostKeyCallback.ql index 2c292785f7f1..c0b5898601c9 100644 --- a/go/ql/src/Security/CWE-322/InsecureHostKeyCallback.ql +++ b/go/ql/src/Security/CWE-322/InsecureHostKeyCallback.ql @@ -22,8 +22,8 @@ class InsecureIgnoreHostKey extends Function { /** An SSH host-key checking function. */ class HostKeyCallbackFunc extends DataFlow::Node { HostKeyCallbackFunc() { - exists(NamedType nt | nt.hasQualifiedName(cryptoSshPackage(), "HostKeyCallback") | - this.getType().getUnderlyingType() = nt.getUnderlyingType() + exists(DefinedType dt | dt.hasQualifiedName(cryptoSshPackage(), "HostKeyCallback") | + this.getType().getUnderlyingType() = dt.getUnderlyingType() ) and // Restrict possible sources to either function definitions or // the result of some external function call (e.g. InsecureIgnoreHostKey()) diff --git a/go/ql/src/experimental/Unsafe/WrongUsageOfUnsafe.ql b/go/ql/src/experimental/Unsafe/WrongUsageOfUnsafe.ql index e0f0098be4e0..f3e40f1e20b5 100644 --- a/go/ql/src/experimental/Unsafe/WrongUsageOfUnsafe.ql +++ b/go/ql/src/experimental/Unsafe/WrongUsageOfUnsafe.ql @@ -14,7 +14,7 @@ import go /* - * Returns the type after all aliases, named types, and pointer + * Returns the type after all aliases, defined types, and pointer * types have been replaced with the actual underlying type. */ diff --git a/go/ql/test/extractor-tests/go1.14/interfaces.ql b/go/ql/test/extractor-tests/go1.14/interfaces.ql index 323713bfb632..1b611451abd9 100644 --- a/go/ql/test/extractor-tests/go1.14/interfaces.ql +++ b/go/ql/test/extractor-tests/go1.14/interfaces.ql @@ -1,5 +1,5 @@ import go -from NamedType t +from DefinedType t where t.getPackage().getName().matches("%main") select t, t.getName(), t.getMethod(_) diff --git a/go/ql/test/library-tests/semmle/go/Types/GenericTypeInstantiationExpr.expected b/go/ql/test/library-tests/semmle/go/Types/GenericTypeInstantiationExpr.expected index acf596f607ba..36d2f2e2332a 100644 --- a/go/ql/test/library-tests/semmle/go/Types/GenericTypeInstantiationExpr.expected +++ b/go/ql/test/library-tests/semmle/go/Types/GenericTypeInstantiationExpr.expected @@ -16,7 +16,7 @@ | generic.go:60:12:60:28 | generic type instantiation expression | generic.go:60:12:60:22 | GenericMap2 | 0 | generic.go:60:24:60:24 | U | | generic.go:60:12:60:28 | generic type instantiation expression | generic.go:60:12:60:22 | GenericMap2 | 1 | generic.go:60:27:60:27 | U | | generic.go:61:12:61:28 | generic type instantiation expression | generic.go:61:12:61:25 | GenericChannel | 0 | generic.go:61:27:61:27 | U | -| generic.go:62:12:62:26 | generic type instantiation expression | generic.go:62:12:62:23 | GenericNamed | 0 | generic.go:62:25:62:25 | U | +| generic.go:62:12:62:28 | generic type instantiation expression | generic.go:62:12:62:25 | GenericDefined | 0 | generic.go:62:27:62:27 | U | | generic.go:70:42:70:64 | generic type instantiation expression | generic.go:70:42:70:57 | GenericInterface | 0 | generic.go:70:59:70:63 | int32 | | generic.go:74:41:74:62 | generic type instantiation expression | generic.go:74:41:74:54 | GenericStruct1 | 0 | generic.go:74:56:74:61 | string | | generic.go:82:18:82:34 | generic type instantiation expression | generic.go:82:18:82:29 | GenericArray | 0 | generic.go:82:31:82:33 | int | diff --git a/go/ql/test/library-tests/semmle/go/Types/InterfaceMethodIds.ql b/go/ql/test/library-tests/semmle/go/Types/InterfaceMethodIds.ql index 356bc85c931b..c34f47abc29b 100644 --- a/go/ql/test/library-tests/semmle/go/Types/InterfaceMethodIds.ql +++ b/go/ql/test/library-tests/semmle/go/Types/InterfaceMethodIds.ql @@ -1,9 +1,9 @@ import go -from NamedType nt, InterfaceType it, Type methodType, string id +from DefinedType dt, InterfaceType it, Type methodType, string id where - nt.getName() = "MixedExportedAndNot" and - it = nt.getUnderlyingType() and + dt.getName() = "MixedExportedAndNot" and + it = dt.getUnderlyingType() and ( it.hasPrivateMethodWithQualifiedName(_, id, methodType) or diff --git a/go/ql/test/library-tests/semmle/go/Types/MethodTypes.expected b/go/ql/test/library-tests/semmle/go/Types/MethodTypes.expected index d143fb3121e4..f5af1c53e406 100644 --- a/go/ql/test/library-tests/semmle/go/Types/MethodTypes.expected +++ b/go/ql/test/library-tests/semmle/go/Types/MethodTypes.expected @@ -13,7 +13,7 @@ | generic.go:47:6:47:16 | MyInterface | dummy14 | func() GenericMap1 | | generic.go:47:6:47:16 | MyInterface | dummy15 | func() GenericMap2 | | generic.go:47:6:47:16 | MyInterface | dummy17 | func() GenericChannel | -| generic.go:47:6:47:16 | MyInterface | dummy18 | func() GenericNamed | +| generic.go:47:6:47:16 | MyInterface | dummy18 | func() GenericDefined | | generic.go:47:6:47:16 | MyInterface | dummy19 | func() MyFuncType1 | | generic.go:47:6:47:16 | MyInterface | dummy20 | func() MyFuncType2 | | interface.go:28:6:28:7 | i6 | String | func() string | diff --git a/go/ql/test/library-tests/semmle/go/Types/MethodTypes.ql b/go/ql/test/library-tests/semmle/go/Types/MethodTypes.ql index 74a597615890..f9eae96b5296 100644 --- a/go/ql/test/library-tests/semmle/go/Types/MethodTypes.ql +++ b/go/ql/test/library-tests/semmle/go/Types/MethodTypes.ql @@ -1,6 +1,6 @@ import go -from NamedType t, string m, Type tp +from DefinedType t, string m, Type tp where exists(t.getEntity().getDeclaration()) and t.getBaseType().hasMethod(m, tp) diff --git a/go/ql/test/library-tests/semmle/go/Types/QualifiedNames.expected b/go/ql/test/library-tests/semmle/go/Types/QualifiedNames.expected index 918f82d01d29..ef350d71e760 100644 --- a/go/ql/test/library-tests/semmle/go/Types/QualifiedNames.expected +++ b/go/ql/test/library-tests/semmle/go/Types/QualifiedNames.expected @@ -25,7 +25,7 @@ | generic.go:40:6:40:16 | GenericMap2 | codeql-go-types.GenericMap2 | | generic.go:41:6:41:19 | GenericChannel | codeql-go-types.GenericChannel | | generic.go:42:6:42:14 | MyMapType | codeql-go-types.MyMapType | -| generic.go:43:6:43:17 | GenericNamed | codeql-go-types.GenericNamed | +| generic.go:43:6:43:19 | GenericDefined | codeql-go-types.GenericDefined | | generic.go:44:6:44:16 | MyFuncType1 | codeql-go-types.MyFuncType1 | | generic.go:45:6:45:16 | MyFuncType2 | codeql-go-types.MyFuncType2 | | generic.go:47:6:47:16 | MyInterface | codeql-go-types.MyInterface | diff --git a/go/ql/test/library-tests/semmle/go/Types/StructFields.ql b/go/ql/test/library-tests/semmle/go/Types/StructFields.ql index 0e0b93b230e3..4509cd610f2d 100644 --- a/go/ql/test/library-tests/semmle/go/Types/StructFields.ql +++ b/go/ql/test/library-tests/semmle/go/Types/StructFields.ql @@ -1,7 +1,7 @@ import go -from StructTypeExpr ste, NamedType named, string name, Type tp +from StructTypeExpr ste, DefinedType defined, string name, Type tp where - named.getUnderlyingType() = ste.getType() and + defined.getUnderlyingType() = ste.getType() and ste.getType().(StructType).hasField(name, tp) -select named, ste, name, tp.pp() +select defined, ste, name, tp.pp() diff --git a/go/ql/test/library-tests/semmle/go/Types/Types.expected b/go/ql/test/library-tests/semmle/go/Types/Types.expected index 2a057f0354a3..e79906180bba 100644 --- a/go/ql/test/library-tests/semmle/go/Types/Types.expected +++ b/go/ql/test/library-tests/semmle/go/Types/Types.expected @@ -25,7 +25,7 @@ | generic.go:40:6:40:16 | GenericMap2 | GenericMap2 | | generic.go:41:6:41:19 | GenericChannel | GenericChannel | | generic.go:42:6:42:14 | MyMapType | MyMapType | -| generic.go:43:6:43:17 | GenericNamed | GenericNamed | +| generic.go:43:6:43:19 | GenericDefined | GenericDefined | | generic.go:44:6:44:16 | MyFuncType1 | MyFuncType1 | | generic.go:45:6:45:16 | MyFuncType2 | MyFuncType2 | | generic.go:47:6:47:16 | MyInterface | MyInterface | diff --git a/go/ql/test/library-tests/semmle/go/Types/aliases.go b/go/ql/test/library-tests/semmle/go/Types/aliases.go index 7ef658136b9c..05827f8ef372 100644 --- a/go/ql/test/library-tests/semmle/go/Types/aliases.go +++ b/go/ql/test/library-tests/semmle/go/Types/aliases.go @@ -15,7 +15,7 @@ func G(Afs2 aliasesS2) int { return Afs2.x } -// This is a named type, not an alias +// This is a defined type, not an alias type S3 struct{ x int } // This is a type alias diff --git a/go/ql/test/library-tests/semmle/go/Types/generic.go b/go/ql/test/library-tests/semmle/go/Types/generic.go index 66c739f70614..e4daba4551af 100644 --- a/go/ql/test/library-tests/semmle/go/Types/generic.go +++ b/go/ql/test/library-tests/semmle/go/Types/generic.go @@ -40,7 +40,7 @@ type GenericMap1[V any] map[string]V type GenericMap2[K comparable, V any] map[K]V type GenericChannel[T comparable] chan<- T type MyMapType map[string]int -type GenericNamed[T comparable] MyMapType +type GenericDefined[T comparable] MyMapType type MyFuncType1[T any] func(T) type MyFuncType2[T1 any, T2 any] func(T1) T2 @@ -59,7 +59,7 @@ type MyInterface[U comparable] interface { dummy14() GenericMap1[U] dummy15() GenericMap2[U, U] dummy17() GenericChannel[U] - dummy18() GenericNamed[U] + dummy18() GenericDefined[U] dummy19() MyFuncType1[U] dummy20() MyFuncType2[U, U] } diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Twirp/tests.ql b/go/ql/test/library-tests/semmle/go/frameworks/Twirp/tests.ql index 563cb149a9a0..5866b6ff3eda 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Twirp/tests.ql +++ b/go/ql/test/library-tests/semmle/go/frameworks/Twirp/tests.ql @@ -54,7 +54,7 @@ query predicate passingPositiveTests(string res, string expectation, InlineTest exists(Twirp::ProtobufMessageType n | t.inType(n)) or expectation = "serviceInterface" and - exists(Twirp::ServiceInterfaceType n | t.inType(n.getNamedType())) + exists(Twirp::ServiceInterfaceType n | t.inType(n.getDefinedType())) or expectation = "serviceClient" and exists(Twirp::ServiceClientType n | t.inType(n)) @@ -90,7 +90,7 @@ query predicate failingPositiveTests(string res, string expectation, InlineTest not exists(Twirp::ProtobufMessageType n | t.inType(n)) or expectation = "serviceInterface" and - not exists(Twirp::ServiceInterfaceType n | t.inType(n.getNamedType())) + not exists(Twirp::ServiceInterfaceType n | t.inType(n.getDefinedType())) or expectation = "serviceClient" and not exists(Twirp::ServiceClientType n | t.inType(n)) From 64c3f703fe22be02a5e53fa6949036aa97bd3bab Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Wed, 12 Feb 2025 11:40:35 +0000 Subject: [PATCH 2/6] Add change note --- go/ql/lib/change-notes/2025-02-12-deprecate-namedtype.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 go/ql/lib/change-notes/2025-02-12-deprecate-namedtype.md diff --git a/go/ql/lib/change-notes/2025-02-12-deprecate-namedtype.md b/go/ql/lib/change-notes/2025-02-12-deprecate-namedtype.md new file mode 100644 index 000000000000..ded0fa491ab1 --- /dev/null +++ b/go/ql/lib/change-notes/2025-02-12-deprecate-namedtype.md @@ -0,0 +1,6 @@ +--- +category: deprecated +--- +* The class `NamedType` has been deprecated. Use the new class `DefinedType` instead. This better matches the terminology used in the Go language specification, which was changed in Go 1.9. +* The member predicate `getNamedType` on `GoMicro::ServiceInterfaceType` has been deprecated. Use the new member predicate `getDefinedType` instead. +* The member predicate `getNamedType` on `Twirp::ServiceInterfaceType` has been deprecated. Use the new member predicate `getDefinedType` instead. From 024fbf8f3ab79bcc299e22a963610dff1dfb691d Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 13 Feb 2025 15:53:24 +0000 Subject: [PATCH 3/6] Rename "named" to "defined" in dbscheme --- go/extractor/dbscheme/tables.go | 4 ++-- go/ql/lib/go.dbscheme | 8 ++++---- go/ql/lib/semmle/go/Types.qll | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/go/extractor/dbscheme/tables.go b/go/extractor/dbscheme/tables.go index f929e79793bc..665ecdcc240f 100644 --- a/go/extractor/dbscheme/tables.go +++ b/go/extractor/dbscheme/tables.go @@ -856,7 +856,7 @@ var ChanTypes = map[gotypes.ChanDir]*BranchType{ } // DefinedType is the type of defined types -var DefinedType = TypeKind.NewBranch("@namedtype", CompositeType) +var DefinedType = TypeKind.NewBranch("@definedtype", CompositeType) // TypeSetLiteral is the type of type set literals var TypeSetLiteral = TypeKind.NewBranch("@typesetliteraltype", CompositeType) @@ -1138,7 +1138,7 @@ var BaseTypeTable = NewTable("base_type", // UnderlyingTypeTable is the table associating defined types with their // underlying type var UnderlyingTypeTable = NewTable("underlying_type", - EntityColumn(DefinedType, "named").Unique(), + EntityColumn(DefinedType, "defined").Unique(), EntityColumn(TypeType, "tp"), ) diff --git a/go/ql/lib/go.dbscheme b/go/ql/lib/go.dbscheme index 4bd57e093275..b3da71c3ac20 100644 --- a/go/ql/lib/go.dbscheme +++ b/go/ql/lib/go.dbscheme @@ -184,7 +184,7 @@ methodreceivers(unique int method: @object ref, int receiver: @object ref); fieldstructs(unique int field: @object ref, int struct: @structtype ref); -methodhosts(int method: @object ref, int host: @namedtype ref); +methodhosts(int method: @object ref, int host: @definedtype ref); defs(int ident: @ident ref, int object: @object ref); @@ -202,7 +202,7 @@ element_type(unique int container: @containertype ref, int tp: @type ref); base_type(unique int ptr: @pointertype ref, int tp: @type ref); -underlying_type(unique int named: @namedtype ref, int tp: @type ref); +underlying_type(unique int defined: @definedtype ref, int tp: @type ref); #keyset[parent, index] component_types(int parent: @compositetype ref, int index: int ref, string name: string ref, int tp: @type ref); @@ -506,7 +506,7 @@ case @type.kind of | 35 = @sendchantype | 36 = @recvchantype | 37 = @sendrcvchantype -| 38 = @namedtype +| 38 = @definedtype | 39 = @typesetliteraltype; @basictype = @booltype | @numerictype | @stringtype | @literaltype | @invalidtype | @unsafepointertype; @@ -531,7 +531,7 @@ case @type.kind of | @stringliteraltype | @nilliteraltype; @compositetype = @typeparamtype | @containertype | @structtype | @pointertype | @interfacetype | @tupletype - | @signaturetype | @namedtype | @typesetliteraltype; + | @signaturetype | @definedtype | @typesetliteraltype; @containertype = @arraytype | @slicetype | @maptype | @chantype; diff --git a/go/ql/lib/semmle/go/Types.qll b/go/ql/lib/semmle/go/Types.qll index 4ba604a9a08a..4eb3a3e03029 100644 --- a/go/ql/lib/semmle/go/Types.qll +++ b/go/ql/lib/semmle/go/Types.qll @@ -1032,7 +1032,7 @@ class SendRecvChanType extends @sendrcvchantype, ChanType { deprecated class NamedType = DefinedType; /** A defined type. */ -class DefinedType extends @namedtype, CompositeType { +class DefinedType extends @definedtype, CompositeType { /** Gets the type which this type is defined to be. */ Type getBaseType() { underlying_type(this, result) } From 29f94f484cd9aa344f6694f57e16b3fb7e93a45f Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 13 Feb 2025 16:19:24 +0000 Subject: [PATCH 4/6] Add upgrade/downgrade scripts --- .../go.dbscheme | 552 ++++++++++++++++++ .../old.dbscheme | 552 ++++++++++++++++++ .../upgrade.properties | 2 + .../go.dbscheme | 552 ++++++++++++++++++ .../old.dbscheme | 552 ++++++++++++++++++ .../upgrade.properties | 2 + 6 files changed, 2212 insertions(+) create mode 100644 go/downgrades/b3da71c3ac204b557c86e9d9c26012360bdbdccb/go.dbscheme create mode 100644 go/downgrades/b3da71c3ac204b557c86e9d9c26012360bdbdccb/old.dbscheme create mode 100644 go/downgrades/b3da71c3ac204b557c86e9d9c26012360bdbdccb/upgrade.properties create mode 100644 go/ql/lib/upgrades/4bd57e093275e5e892dfb16b55ed4bd76ea662be/go.dbscheme create mode 100644 go/ql/lib/upgrades/4bd57e093275e5e892dfb16b55ed4bd76ea662be/old.dbscheme create mode 100644 go/ql/lib/upgrades/4bd57e093275e5e892dfb16b55ed4bd76ea662be/upgrade.properties diff --git a/go/downgrades/b3da71c3ac204b557c86e9d9c26012360bdbdccb/go.dbscheme b/go/downgrades/b3da71c3ac204b557c86e9d9c26012360bdbdccb/go.dbscheme new file mode 100644 index 000000000000..4bd57e093275 --- /dev/null +++ b/go/downgrades/b3da71c3ac204b557c86e9d9c26012360bdbdccb/go.dbscheme @@ -0,0 +1,552 @@ +/** Auto-generated dbscheme; do not edit. Run `make gen` in directory `go/` to regenerate. */ + + +/** Duplicate code **/ + +duplicateCode( + unique int id : @duplication, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +similarCode( + unique int id : @similarity, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +@duplication_or_similarity = @duplication | @similarity; + +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref); + +/** External data **/ + +externalData( + int id : @externalDataElement, + varchar(900) path : string ref, + int column: int ref, + varchar(900) value : string ref +); + +snapshotDate(unique date snapshotDate : date ref); + +sourceLocationPrefix(varchar(900) prefix : string ref); + + +/* + * XML Files + */ + +xmlEncoding( + unique int id: @file ref, + string encoding: string ref +); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +compilations(unique int id: @compilation, string cwd: string ref); + +#keyset[id, num] +compilation_args(int id: @compilation ref, int num: int ref, string arg: string ref); + +#keyset[id, num, kind] +compilation_time(int id: @compilation ref, int num: int ref, int kind: int ref, float secs: float ref); + +diagnostic_for(unique int diagnostic: @diagnostic ref, int compilation: @compilation ref, int file_number: int ref, int file_number_diagnostic_number: int ref); + +compilation_finished(unique int id: @compilation ref, float cpu_seconds: float ref, float elapsed_seconds: float ref); + +#keyset[id, num] +compilation_compiling_files(int id: @compilation ref, int num: int ref, int file: @file ref); + +diagnostics(unique int id: @diagnostic, int severity: int ref, string error_tag: string ref, string error_message: string ref, + string full_error_message: string ref, int location: @location ref); + +locations_default(unique int id: @location_default, int file: @file ref, int beginLine: int ref, int beginColumn: int ref, + int endLine: int ref, int endColumn: int ref); + +numlines(int element_id: @sourceline ref, int num_lines: int ref, int num_code: int ref, int num_comment: int ref); + +files(unique int id: @file, string name: string ref); + +folders(unique int id: @folder, string name: string ref); + +containerparent(int parent: @container ref, unique int child: @container ref); + +has_location(unique int locatable: @locatable ref, int location: @location ref); + +#keyset[parent, idx] +comment_groups(unique int id: @comment_group, int parent: @file ref, int idx: int ref); + +comments(unique int id: @comment, int kind: int ref, int parent: @comment_group ref, int idx: int ref, string text: string ref); + +doc_comments(unique int node: @documentable ref, int comment: @comment_group ref); + +#keyset[parent, idx] +exprs(unique int id: @expr, int kind: int ref, int parent: @exprparent ref, int idx: int ref); + +literals(unique int expr: @expr ref, string value: string ref, string raw: string ref); + +constvalues(unique int expr: @expr ref, string value: string ref, string exact: string ref); + +fields(unique int id: @field, int parent: @fieldparent ref, int idx: int ref); + +typeparamdecls(unique int id: @typeparamdecl, int parent: @typeparamdeclparent ref, int idx: int ref); + +#keyset[parent, idx] +stmts(unique int id: @stmt, int kind: int ref, int parent: @stmtparent ref, int idx: int ref); + +#keyset[parent, idx] +decls(unique int id: @decl, int kind: int ref, int parent: @declparent ref, int idx: int ref); + +#keyset[parent, idx] +specs(unique int id: @spec, int kind: int ref, int parent: @gendecl ref, int idx: int ref); + +scopes(unique int id: @scope, int kind: int ref); + +scopenesting(unique int inner: @scope ref, int outer: @scope ref); + +scopenodes(unique int node: @scopenode ref, int scope: @localscope ref); + +objects(unique int id: @object, int kind: int ref, string name: string ref); + +objectscopes(unique int object: @object ref, int scope: @scope ref); + +objecttypes(unique int object: @object ref, int tp: @type ref); + +methodreceivers(unique int method: @object ref, int receiver: @object ref); + +fieldstructs(unique int field: @object ref, int struct: @structtype ref); + +methodhosts(int method: @object ref, int host: @namedtype ref); + +defs(int ident: @ident ref, int object: @object ref); + +uses(int ident: @ident ref, int object: @object ref); + +types(unique int id: @type, int kind: int ref); + +type_of(unique int expr: @expr ref, int tp: @type ref); + +typename(unique int tp: @type ref, string name: string ref); + +key_type(unique int map: @maptype ref, int tp: @type ref); + +element_type(unique int container: @containertype ref, int tp: @type ref); + +base_type(unique int ptr: @pointertype ref, int tp: @type ref); + +underlying_type(unique int named: @namedtype ref, int tp: @type ref); + +#keyset[parent, index] +component_types(int parent: @compositetype ref, int index: int ref, string name: string ref, int tp: @type ref); + +#keyset[parent, index] +struct_tags(int parent: @structtype ref, int index: int ref, string tag: string ref); + +#keyset[interface, index] +interface_private_method_ids(int interface: @interfacetype ref, int index: int ref, string id: string ref); + +array_length(unique int tp: @arraytype ref, string len: string ref); + +type_objects(unique int tp: @type ref, int object: @object ref); + +packages(unique int id: @package, string name: string ref, string path: string ref, int scope: @packagescope ref); + +#keyset[parent, idx] +modexprs(unique int id: @modexpr, int kind: int ref, int parent: @modexprparent ref, int idx: int ref); + +#keyset[parent, idx] +modtokens(string token: string ref, int parent: @modexpr ref, int idx: int ref); + +#keyset[package, idx] +errors(unique int id: @error, int kind: int ref, string msg: string ref, string rawpos: string ref, + string file: string ref, int line: int ref, int col: int ref, int package: @package ref, int idx: int ref); + +has_ellipsis(int id: @callorconversionexpr ref); + +variadic(int id: @signaturetype ref); + +#keyset[parent, idx] +typeparam(unique int tp: @typeparamtype ref, string name: string ref, int bound: @compositetype ref, + int parent: @typeparamparentobject ref, int idx: int ref); + +@container = @file | @folder; + +@locatable = @xmllocatable | @node | @localscope; + +@node = @documentable | @exprparent | @modexprparent | @fieldparent | @stmtparent | @declparent | @typeparamdeclparent + | @scopenode | @comment_group | @comment; + +@documentable = @file | @field | @typeparamdecl | @spec | @gendecl | @funcdecl | @modexpr; + +@exprparent = @funcdef | @file | @expr | @field | @stmt | @decl | @typeparamdecl | @spec; + +@modexprparent = @file | @modexpr; + +@fieldparent = @decl | @structtypeexpr | @functypeexpr | @interfacetypeexpr; + +@stmtparent = @funcdef | @stmt | @decl; + +@declparent = @file | @declstmt; + +@typeparamdeclparent = @funcdecl | @typespec; + +@funcdef = @funclit | @funcdecl; + +@scopenode = @file | @functypeexpr | @blockstmt | @ifstmt | @caseclause | @switchstmt | @commclause | @loopstmt; + +@location = @location_default; + +@sourceline = @locatable; + +case @comment.kind of + 0 = @slashslashcomment +| 1 = @slashstarcomment; + +case @expr.kind of + 0 = @badexpr +| 1 = @ident +| 2 = @ellipsis +| 3 = @intlit +| 4 = @floatlit +| 5 = @imaglit +| 6 = @charlit +| 7 = @stringlit +| 8 = @funclit +| 9 = @compositelit +| 10 = @parenexpr +| 11 = @selectorexpr +| 12 = @indexexpr +| 13 = @genericfunctioninstantiationexpr +| 14 = @generictypeinstantiationexpr +| 15 = @sliceexpr +| 16 = @typeassertexpr +| 17 = @callorconversionexpr +| 18 = @starexpr +| 19 = @keyvalueexpr +| 20 = @arraytypeexpr +| 21 = @structtypeexpr +| 22 = @functypeexpr +| 23 = @interfacetypeexpr +| 24 = @maptypeexpr +| 25 = @typesetliteralexpr +| 26 = @plusexpr +| 27 = @minusexpr +| 28 = @notexpr +| 29 = @complementexpr +| 30 = @derefexpr +| 31 = @addressexpr +| 32 = @arrowexpr +| 33 = @lorexpr +| 34 = @landexpr +| 35 = @eqlexpr +| 36 = @neqexpr +| 37 = @lssexpr +| 38 = @leqexpr +| 39 = @gtrexpr +| 40 = @geqexpr +| 41 = @addexpr +| 42 = @subexpr +| 43 = @orexpr +| 44 = @xorexpr +| 45 = @mulexpr +| 46 = @quoexpr +| 47 = @remexpr +| 48 = @shlexpr +| 49 = @shrexpr +| 50 = @andexpr +| 51 = @andnotexpr +| 52 = @sendchantypeexpr +| 53 = @recvchantypeexpr +| 54 = @sendrcvchantypeexpr; + +@basiclit = @intlit | @floatlit | @imaglit | @charlit | @stringlit; + +@operatorexpr = @logicalexpr | @arithmeticexpr | @bitwiseexpr | @unaryexpr | @binaryexpr; + +@logicalexpr = @logicalunaryexpr | @logicalbinaryexpr; + +@arithmeticexpr = @arithmeticunaryexpr | @arithmeticbinaryexpr; + +@bitwiseexpr = @bitwiseunaryexpr | @bitwisebinaryexpr; + +@unaryexpr = @logicalunaryexpr | @bitwiseunaryexpr | @arithmeticunaryexpr | @derefexpr | @addressexpr | @arrowexpr; + +@logicalunaryexpr = @notexpr; + +@bitwiseunaryexpr = @complementexpr; + +@arithmeticunaryexpr = @plusexpr | @minusexpr; + +@binaryexpr = @logicalbinaryexpr | @bitwisebinaryexpr | @arithmeticbinaryexpr | @comparison; + +@logicalbinaryexpr = @lorexpr | @landexpr; + +@bitwisebinaryexpr = @shiftexpr | @orexpr | @xorexpr | @andexpr | @andnotexpr; + +@arithmeticbinaryexpr = @addexpr | @subexpr | @mulexpr | @quoexpr | @remexpr; + +@shiftexpr = @shlexpr | @shrexpr; + +@comparison = @equalitytest | @relationalcomparison; + +@equalitytest = @eqlexpr | @neqexpr; + +@relationalcomparison = @lssexpr | @leqexpr | @gtrexpr | @geqexpr; + +@chantypeexpr = @sendchantypeexpr | @recvchantypeexpr | @sendrcvchantypeexpr; + +case @stmt.kind of + 0 = @badstmt +| 1 = @declstmt +| 2 = @emptystmt +| 3 = @labeledstmt +| 4 = @exprstmt +| 5 = @sendstmt +| 6 = @incstmt +| 7 = @decstmt +| 8 = @gostmt +| 9 = @deferstmt +| 10 = @returnstmt +| 11 = @breakstmt +| 12 = @continuestmt +| 13 = @gotostmt +| 14 = @fallthroughstmt +| 15 = @blockstmt +| 16 = @ifstmt +| 17 = @caseclause +| 18 = @exprswitchstmt +| 19 = @typeswitchstmt +| 20 = @commclause +| 21 = @selectstmt +| 22 = @forstmt +| 23 = @rangestmt +| 24 = @assignstmt +| 25 = @definestmt +| 26 = @addassignstmt +| 27 = @subassignstmt +| 28 = @mulassignstmt +| 29 = @quoassignstmt +| 30 = @remassignstmt +| 31 = @andassignstmt +| 32 = @orassignstmt +| 33 = @xorassignstmt +| 34 = @shlassignstmt +| 35 = @shrassignstmt +| 36 = @andnotassignstmt; + +@incdecstmt = @incstmt | @decstmt; + +@assignment = @simpleassignstmt | @compoundassignstmt; + +@simpleassignstmt = @assignstmt | @definestmt; + +@compoundassignstmt = @addassignstmt | @subassignstmt | @mulassignstmt | @quoassignstmt | @remassignstmt + | @andassignstmt | @orassignstmt | @xorassignstmt | @shlassignstmt | @shrassignstmt | @andnotassignstmt; + +@branchstmt = @breakstmt | @continuestmt | @gotostmt | @fallthroughstmt; + +@switchstmt = @exprswitchstmt | @typeswitchstmt; + +@loopstmt = @forstmt | @rangestmt; + +case @decl.kind of + 0 = @baddecl +| 1 = @importdecl +| 2 = @constdecl +| 3 = @typedecl +| 4 = @vardecl +| 5 = @funcdecl; + +@gendecl = @importdecl | @constdecl | @typedecl | @vardecl; + +case @spec.kind of + 0 = @importspec +| 1 = @valuespec +| 2 = @typedefspec +| 3 = @aliasspec; + +@typespec = @typedefspec | @aliasspec; + +case @object.kind of + 0 = @pkgobject +| 1 = @decltypeobject +| 2 = @builtintypeobject +| 3 = @declconstobject +| 4 = @builtinconstobject +| 5 = @declvarobject +| 6 = @declfunctionobject +| 7 = @builtinfunctionobject +| 8 = @labelobject; + +@typeparamparentobject = @decltypeobject | @declfunctionobject; + +@declobject = @decltypeobject | @declconstobject | @declvarobject | @declfunctionobject; + +@builtinobject = @builtintypeobject | @builtinconstobject | @builtinfunctionobject; + +@typeobject = @decltypeobject | @builtintypeobject; + +@valueobject = @constobject | @varobject | @functionobject; + +@constobject = @declconstobject | @builtinconstobject; + +@varobject = @declvarobject; + +@functionobject = @declfunctionobject | @builtinfunctionobject; + +case @scope.kind of + 0 = @universescope +| 1 = @packagescope +| 2 = @localscope; + +case @type.kind of + 0 = @invalidtype +| 1 = @boolexprtype +| 2 = @inttype +| 3 = @int8type +| 4 = @int16type +| 5 = @int32type +| 6 = @int64type +| 7 = @uinttype +| 8 = @uint8type +| 9 = @uint16type +| 10 = @uint32type +| 11 = @uint64type +| 12 = @uintptrtype +| 13 = @float32type +| 14 = @float64type +| 15 = @complex64type +| 16 = @complex128type +| 17 = @stringexprtype +| 18 = @unsafepointertype +| 19 = @boolliteraltype +| 20 = @intliteraltype +| 21 = @runeliteraltype +| 22 = @floatliteraltype +| 23 = @complexliteraltype +| 24 = @stringliteraltype +| 25 = @nilliteraltype +| 26 = @typeparamtype +| 27 = @arraytype +| 28 = @slicetype +| 29 = @structtype +| 30 = @pointertype +| 31 = @interfacetype +| 32 = @tupletype +| 33 = @signaturetype +| 34 = @maptype +| 35 = @sendchantype +| 36 = @recvchantype +| 37 = @sendrcvchantype +| 38 = @namedtype +| 39 = @typesetliteraltype; + +@basictype = @booltype | @numerictype | @stringtype | @literaltype | @invalidtype | @unsafepointertype; + +@booltype = @boolexprtype | @boolliteraltype; + +@numerictype = @integertype | @floattype | @complextype; + +@integertype = @signedintegertype | @unsignedintegertype; + +@signedintegertype = @inttype | @int8type | @int16type | @int32type | @int64type | @intliteraltype | @runeliteraltype; + +@unsignedintegertype = @uinttype | @uint8type | @uint16type | @uint32type | @uint64type | @uintptrtype; + +@floattype = @float32type | @float64type | @floatliteraltype; + +@complextype = @complex64type | @complex128type | @complexliteraltype; + +@stringtype = @stringexprtype | @stringliteraltype; + +@literaltype = @boolliteraltype | @intliteraltype | @runeliteraltype | @floatliteraltype | @complexliteraltype + | @stringliteraltype | @nilliteraltype; + +@compositetype = @typeparamtype | @containertype | @structtype | @pointertype | @interfacetype | @tupletype + | @signaturetype | @namedtype | @typesetliteraltype; + +@containertype = @arraytype | @slicetype | @maptype | @chantype; + +@chantype = @sendchantype | @recvchantype | @sendrcvchantype; + +case @modexpr.kind of + 0 = @modcommentblock +| 1 = @modline +| 2 = @modlineblock +| 3 = @modlparen +| 4 = @modrparen; + +case @error.kind of + 0 = @unknownerror +| 1 = @listerror +| 2 = @parseerror +| 3 = @typeerror; + diff --git a/go/downgrades/b3da71c3ac204b557c86e9d9c26012360bdbdccb/old.dbscheme b/go/downgrades/b3da71c3ac204b557c86e9d9c26012360bdbdccb/old.dbscheme new file mode 100644 index 000000000000..b3da71c3ac20 --- /dev/null +++ b/go/downgrades/b3da71c3ac204b557c86e9d9c26012360bdbdccb/old.dbscheme @@ -0,0 +1,552 @@ +/** Auto-generated dbscheme; do not edit. Run `make gen` in directory `go/` to regenerate. */ + + +/** Duplicate code **/ + +duplicateCode( + unique int id : @duplication, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +similarCode( + unique int id : @similarity, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +@duplication_or_similarity = @duplication | @similarity; + +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref); + +/** External data **/ + +externalData( + int id : @externalDataElement, + varchar(900) path : string ref, + int column: int ref, + varchar(900) value : string ref +); + +snapshotDate(unique date snapshotDate : date ref); + +sourceLocationPrefix(varchar(900) prefix : string ref); + + +/* + * XML Files + */ + +xmlEncoding( + unique int id: @file ref, + string encoding: string ref +); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +compilations(unique int id: @compilation, string cwd: string ref); + +#keyset[id, num] +compilation_args(int id: @compilation ref, int num: int ref, string arg: string ref); + +#keyset[id, num, kind] +compilation_time(int id: @compilation ref, int num: int ref, int kind: int ref, float secs: float ref); + +diagnostic_for(unique int diagnostic: @diagnostic ref, int compilation: @compilation ref, int file_number: int ref, int file_number_diagnostic_number: int ref); + +compilation_finished(unique int id: @compilation ref, float cpu_seconds: float ref, float elapsed_seconds: float ref); + +#keyset[id, num] +compilation_compiling_files(int id: @compilation ref, int num: int ref, int file: @file ref); + +diagnostics(unique int id: @diagnostic, int severity: int ref, string error_tag: string ref, string error_message: string ref, + string full_error_message: string ref, int location: @location ref); + +locations_default(unique int id: @location_default, int file: @file ref, int beginLine: int ref, int beginColumn: int ref, + int endLine: int ref, int endColumn: int ref); + +numlines(int element_id: @sourceline ref, int num_lines: int ref, int num_code: int ref, int num_comment: int ref); + +files(unique int id: @file, string name: string ref); + +folders(unique int id: @folder, string name: string ref); + +containerparent(int parent: @container ref, unique int child: @container ref); + +has_location(unique int locatable: @locatable ref, int location: @location ref); + +#keyset[parent, idx] +comment_groups(unique int id: @comment_group, int parent: @file ref, int idx: int ref); + +comments(unique int id: @comment, int kind: int ref, int parent: @comment_group ref, int idx: int ref, string text: string ref); + +doc_comments(unique int node: @documentable ref, int comment: @comment_group ref); + +#keyset[parent, idx] +exprs(unique int id: @expr, int kind: int ref, int parent: @exprparent ref, int idx: int ref); + +literals(unique int expr: @expr ref, string value: string ref, string raw: string ref); + +constvalues(unique int expr: @expr ref, string value: string ref, string exact: string ref); + +fields(unique int id: @field, int parent: @fieldparent ref, int idx: int ref); + +typeparamdecls(unique int id: @typeparamdecl, int parent: @typeparamdeclparent ref, int idx: int ref); + +#keyset[parent, idx] +stmts(unique int id: @stmt, int kind: int ref, int parent: @stmtparent ref, int idx: int ref); + +#keyset[parent, idx] +decls(unique int id: @decl, int kind: int ref, int parent: @declparent ref, int idx: int ref); + +#keyset[parent, idx] +specs(unique int id: @spec, int kind: int ref, int parent: @gendecl ref, int idx: int ref); + +scopes(unique int id: @scope, int kind: int ref); + +scopenesting(unique int inner: @scope ref, int outer: @scope ref); + +scopenodes(unique int node: @scopenode ref, int scope: @localscope ref); + +objects(unique int id: @object, int kind: int ref, string name: string ref); + +objectscopes(unique int object: @object ref, int scope: @scope ref); + +objecttypes(unique int object: @object ref, int tp: @type ref); + +methodreceivers(unique int method: @object ref, int receiver: @object ref); + +fieldstructs(unique int field: @object ref, int struct: @structtype ref); + +methodhosts(int method: @object ref, int host: @definedtype ref); + +defs(int ident: @ident ref, int object: @object ref); + +uses(int ident: @ident ref, int object: @object ref); + +types(unique int id: @type, int kind: int ref); + +type_of(unique int expr: @expr ref, int tp: @type ref); + +typename(unique int tp: @type ref, string name: string ref); + +key_type(unique int map: @maptype ref, int tp: @type ref); + +element_type(unique int container: @containertype ref, int tp: @type ref); + +base_type(unique int ptr: @pointertype ref, int tp: @type ref); + +underlying_type(unique int defined: @definedtype ref, int tp: @type ref); + +#keyset[parent, index] +component_types(int parent: @compositetype ref, int index: int ref, string name: string ref, int tp: @type ref); + +#keyset[parent, index] +struct_tags(int parent: @structtype ref, int index: int ref, string tag: string ref); + +#keyset[interface, index] +interface_private_method_ids(int interface: @interfacetype ref, int index: int ref, string id: string ref); + +array_length(unique int tp: @arraytype ref, string len: string ref); + +type_objects(unique int tp: @type ref, int object: @object ref); + +packages(unique int id: @package, string name: string ref, string path: string ref, int scope: @packagescope ref); + +#keyset[parent, idx] +modexprs(unique int id: @modexpr, int kind: int ref, int parent: @modexprparent ref, int idx: int ref); + +#keyset[parent, idx] +modtokens(string token: string ref, int parent: @modexpr ref, int idx: int ref); + +#keyset[package, idx] +errors(unique int id: @error, int kind: int ref, string msg: string ref, string rawpos: string ref, + string file: string ref, int line: int ref, int col: int ref, int package: @package ref, int idx: int ref); + +has_ellipsis(int id: @callorconversionexpr ref); + +variadic(int id: @signaturetype ref); + +#keyset[parent, idx] +typeparam(unique int tp: @typeparamtype ref, string name: string ref, int bound: @compositetype ref, + int parent: @typeparamparentobject ref, int idx: int ref); + +@container = @file | @folder; + +@locatable = @xmllocatable | @node | @localscope; + +@node = @documentable | @exprparent | @modexprparent | @fieldparent | @stmtparent | @declparent | @typeparamdeclparent + | @scopenode | @comment_group | @comment; + +@documentable = @file | @field | @typeparamdecl | @spec | @gendecl | @funcdecl | @modexpr; + +@exprparent = @funcdef | @file | @expr | @field | @stmt | @decl | @typeparamdecl | @spec; + +@modexprparent = @file | @modexpr; + +@fieldparent = @decl | @structtypeexpr | @functypeexpr | @interfacetypeexpr; + +@stmtparent = @funcdef | @stmt | @decl; + +@declparent = @file | @declstmt; + +@typeparamdeclparent = @funcdecl | @typespec; + +@funcdef = @funclit | @funcdecl; + +@scopenode = @file | @functypeexpr | @blockstmt | @ifstmt | @caseclause | @switchstmt | @commclause | @loopstmt; + +@location = @location_default; + +@sourceline = @locatable; + +case @comment.kind of + 0 = @slashslashcomment +| 1 = @slashstarcomment; + +case @expr.kind of + 0 = @badexpr +| 1 = @ident +| 2 = @ellipsis +| 3 = @intlit +| 4 = @floatlit +| 5 = @imaglit +| 6 = @charlit +| 7 = @stringlit +| 8 = @funclit +| 9 = @compositelit +| 10 = @parenexpr +| 11 = @selectorexpr +| 12 = @indexexpr +| 13 = @genericfunctioninstantiationexpr +| 14 = @generictypeinstantiationexpr +| 15 = @sliceexpr +| 16 = @typeassertexpr +| 17 = @callorconversionexpr +| 18 = @starexpr +| 19 = @keyvalueexpr +| 20 = @arraytypeexpr +| 21 = @structtypeexpr +| 22 = @functypeexpr +| 23 = @interfacetypeexpr +| 24 = @maptypeexpr +| 25 = @typesetliteralexpr +| 26 = @plusexpr +| 27 = @minusexpr +| 28 = @notexpr +| 29 = @complementexpr +| 30 = @derefexpr +| 31 = @addressexpr +| 32 = @arrowexpr +| 33 = @lorexpr +| 34 = @landexpr +| 35 = @eqlexpr +| 36 = @neqexpr +| 37 = @lssexpr +| 38 = @leqexpr +| 39 = @gtrexpr +| 40 = @geqexpr +| 41 = @addexpr +| 42 = @subexpr +| 43 = @orexpr +| 44 = @xorexpr +| 45 = @mulexpr +| 46 = @quoexpr +| 47 = @remexpr +| 48 = @shlexpr +| 49 = @shrexpr +| 50 = @andexpr +| 51 = @andnotexpr +| 52 = @sendchantypeexpr +| 53 = @recvchantypeexpr +| 54 = @sendrcvchantypeexpr; + +@basiclit = @intlit | @floatlit | @imaglit | @charlit | @stringlit; + +@operatorexpr = @logicalexpr | @arithmeticexpr | @bitwiseexpr | @unaryexpr | @binaryexpr; + +@logicalexpr = @logicalunaryexpr | @logicalbinaryexpr; + +@arithmeticexpr = @arithmeticunaryexpr | @arithmeticbinaryexpr; + +@bitwiseexpr = @bitwiseunaryexpr | @bitwisebinaryexpr; + +@unaryexpr = @logicalunaryexpr | @bitwiseunaryexpr | @arithmeticunaryexpr | @derefexpr | @addressexpr | @arrowexpr; + +@logicalunaryexpr = @notexpr; + +@bitwiseunaryexpr = @complementexpr; + +@arithmeticunaryexpr = @plusexpr | @minusexpr; + +@binaryexpr = @logicalbinaryexpr | @bitwisebinaryexpr | @arithmeticbinaryexpr | @comparison; + +@logicalbinaryexpr = @lorexpr | @landexpr; + +@bitwisebinaryexpr = @shiftexpr | @orexpr | @xorexpr | @andexpr | @andnotexpr; + +@arithmeticbinaryexpr = @addexpr | @subexpr | @mulexpr | @quoexpr | @remexpr; + +@shiftexpr = @shlexpr | @shrexpr; + +@comparison = @equalitytest | @relationalcomparison; + +@equalitytest = @eqlexpr | @neqexpr; + +@relationalcomparison = @lssexpr | @leqexpr | @gtrexpr | @geqexpr; + +@chantypeexpr = @sendchantypeexpr | @recvchantypeexpr | @sendrcvchantypeexpr; + +case @stmt.kind of + 0 = @badstmt +| 1 = @declstmt +| 2 = @emptystmt +| 3 = @labeledstmt +| 4 = @exprstmt +| 5 = @sendstmt +| 6 = @incstmt +| 7 = @decstmt +| 8 = @gostmt +| 9 = @deferstmt +| 10 = @returnstmt +| 11 = @breakstmt +| 12 = @continuestmt +| 13 = @gotostmt +| 14 = @fallthroughstmt +| 15 = @blockstmt +| 16 = @ifstmt +| 17 = @caseclause +| 18 = @exprswitchstmt +| 19 = @typeswitchstmt +| 20 = @commclause +| 21 = @selectstmt +| 22 = @forstmt +| 23 = @rangestmt +| 24 = @assignstmt +| 25 = @definestmt +| 26 = @addassignstmt +| 27 = @subassignstmt +| 28 = @mulassignstmt +| 29 = @quoassignstmt +| 30 = @remassignstmt +| 31 = @andassignstmt +| 32 = @orassignstmt +| 33 = @xorassignstmt +| 34 = @shlassignstmt +| 35 = @shrassignstmt +| 36 = @andnotassignstmt; + +@incdecstmt = @incstmt | @decstmt; + +@assignment = @simpleassignstmt | @compoundassignstmt; + +@simpleassignstmt = @assignstmt | @definestmt; + +@compoundassignstmt = @addassignstmt | @subassignstmt | @mulassignstmt | @quoassignstmt | @remassignstmt + | @andassignstmt | @orassignstmt | @xorassignstmt | @shlassignstmt | @shrassignstmt | @andnotassignstmt; + +@branchstmt = @breakstmt | @continuestmt | @gotostmt | @fallthroughstmt; + +@switchstmt = @exprswitchstmt | @typeswitchstmt; + +@loopstmt = @forstmt | @rangestmt; + +case @decl.kind of + 0 = @baddecl +| 1 = @importdecl +| 2 = @constdecl +| 3 = @typedecl +| 4 = @vardecl +| 5 = @funcdecl; + +@gendecl = @importdecl | @constdecl | @typedecl | @vardecl; + +case @spec.kind of + 0 = @importspec +| 1 = @valuespec +| 2 = @typedefspec +| 3 = @aliasspec; + +@typespec = @typedefspec | @aliasspec; + +case @object.kind of + 0 = @pkgobject +| 1 = @decltypeobject +| 2 = @builtintypeobject +| 3 = @declconstobject +| 4 = @builtinconstobject +| 5 = @declvarobject +| 6 = @declfunctionobject +| 7 = @builtinfunctionobject +| 8 = @labelobject; + +@typeparamparentobject = @decltypeobject | @declfunctionobject; + +@declobject = @decltypeobject | @declconstobject | @declvarobject | @declfunctionobject; + +@builtinobject = @builtintypeobject | @builtinconstobject | @builtinfunctionobject; + +@typeobject = @decltypeobject | @builtintypeobject; + +@valueobject = @constobject | @varobject | @functionobject; + +@constobject = @declconstobject | @builtinconstobject; + +@varobject = @declvarobject; + +@functionobject = @declfunctionobject | @builtinfunctionobject; + +case @scope.kind of + 0 = @universescope +| 1 = @packagescope +| 2 = @localscope; + +case @type.kind of + 0 = @invalidtype +| 1 = @boolexprtype +| 2 = @inttype +| 3 = @int8type +| 4 = @int16type +| 5 = @int32type +| 6 = @int64type +| 7 = @uinttype +| 8 = @uint8type +| 9 = @uint16type +| 10 = @uint32type +| 11 = @uint64type +| 12 = @uintptrtype +| 13 = @float32type +| 14 = @float64type +| 15 = @complex64type +| 16 = @complex128type +| 17 = @stringexprtype +| 18 = @unsafepointertype +| 19 = @boolliteraltype +| 20 = @intliteraltype +| 21 = @runeliteraltype +| 22 = @floatliteraltype +| 23 = @complexliteraltype +| 24 = @stringliteraltype +| 25 = @nilliteraltype +| 26 = @typeparamtype +| 27 = @arraytype +| 28 = @slicetype +| 29 = @structtype +| 30 = @pointertype +| 31 = @interfacetype +| 32 = @tupletype +| 33 = @signaturetype +| 34 = @maptype +| 35 = @sendchantype +| 36 = @recvchantype +| 37 = @sendrcvchantype +| 38 = @definedtype +| 39 = @typesetliteraltype; + +@basictype = @booltype | @numerictype | @stringtype | @literaltype | @invalidtype | @unsafepointertype; + +@booltype = @boolexprtype | @boolliteraltype; + +@numerictype = @integertype | @floattype | @complextype; + +@integertype = @signedintegertype | @unsignedintegertype; + +@signedintegertype = @inttype | @int8type | @int16type | @int32type | @int64type | @intliteraltype | @runeliteraltype; + +@unsignedintegertype = @uinttype | @uint8type | @uint16type | @uint32type | @uint64type | @uintptrtype; + +@floattype = @float32type | @float64type | @floatliteraltype; + +@complextype = @complex64type | @complex128type | @complexliteraltype; + +@stringtype = @stringexprtype | @stringliteraltype; + +@literaltype = @boolliteraltype | @intliteraltype | @runeliteraltype | @floatliteraltype | @complexliteraltype + | @stringliteraltype | @nilliteraltype; + +@compositetype = @typeparamtype | @containertype | @structtype | @pointertype | @interfacetype | @tupletype + | @signaturetype | @definedtype | @typesetliteraltype; + +@containertype = @arraytype | @slicetype | @maptype | @chantype; + +@chantype = @sendchantype | @recvchantype | @sendrcvchantype; + +case @modexpr.kind of + 0 = @modcommentblock +| 1 = @modline +| 2 = @modlineblock +| 3 = @modlparen +| 4 = @modrparen; + +case @error.kind of + 0 = @unknownerror +| 1 = @listerror +| 2 = @parseerror +| 3 = @typeerror; + diff --git a/go/downgrades/b3da71c3ac204b557c86e9d9c26012360bdbdccb/upgrade.properties b/go/downgrades/b3da71c3ac204b557c86e9d9c26012360bdbdccb/upgrade.properties new file mode 100644 index 000000000000..64da53384a51 --- /dev/null +++ b/go/downgrades/b3da71c3ac204b557c86e9d9c26012360bdbdccb/upgrade.properties @@ -0,0 +1,2 @@ +description: +compatibility: full|backwards|partial|breaking diff --git a/go/ql/lib/upgrades/4bd57e093275e5e892dfb16b55ed4bd76ea662be/go.dbscheme b/go/ql/lib/upgrades/4bd57e093275e5e892dfb16b55ed4bd76ea662be/go.dbscheme new file mode 100644 index 000000000000..b3da71c3ac20 --- /dev/null +++ b/go/ql/lib/upgrades/4bd57e093275e5e892dfb16b55ed4bd76ea662be/go.dbscheme @@ -0,0 +1,552 @@ +/** Auto-generated dbscheme; do not edit. Run `make gen` in directory `go/` to regenerate. */ + + +/** Duplicate code **/ + +duplicateCode( + unique int id : @duplication, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +similarCode( + unique int id : @similarity, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +@duplication_or_similarity = @duplication | @similarity; + +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref); + +/** External data **/ + +externalData( + int id : @externalDataElement, + varchar(900) path : string ref, + int column: int ref, + varchar(900) value : string ref +); + +snapshotDate(unique date snapshotDate : date ref); + +sourceLocationPrefix(varchar(900) prefix : string ref); + + +/* + * XML Files + */ + +xmlEncoding( + unique int id: @file ref, + string encoding: string ref +); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +compilations(unique int id: @compilation, string cwd: string ref); + +#keyset[id, num] +compilation_args(int id: @compilation ref, int num: int ref, string arg: string ref); + +#keyset[id, num, kind] +compilation_time(int id: @compilation ref, int num: int ref, int kind: int ref, float secs: float ref); + +diagnostic_for(unique int diagnostic: @diagnostic ref, int compilation: @compilation ref, int file_number: int ref, int file_number_diagnostic_number: int ref); + +compilation_finished(unique int id: @compilation ref, float cpu_seconds: float ref, float elapsed_seconds: float ref); + +#keyset[id, num] +compilation_compiling_files(int id: @compilation ref, int num: int ref, int file: @file ref); + +diagnostics(unique int id: @diagnostic, int severity: int ref, string error_tag: string ref, string error_message: string ref, + string full_error_message: string ref, int location: @location ref); + +locations_default(unique int id: @location_default, int file: @file ref, int beginLine: int ref, int beginColumn: int ref, + int endLine: int ref, int endColumn: int ref); + +numlines(int element_id: @sourceline ref, int num_lines: int ref, int num_code: int ref, int num_comment: int ref); + +files(unique int id: @file, string name: string ref); + +folders(unique int id: @folder, string name: string ref); + +containerparent(int parent: @container ref, unique int child: @container ref); + +has_location(unique int locatable: @locatable ref, int location: @location ref); + +#keyset[parent, idx] +comment_groups(unique int id: @comment_group, int parent: @file ref, int idx: int ref); + +comments(unique int id: @comment, int kind: int ref, int parent: @comment_group ref, int idx: int ref, string text: string ref); + +doc_comments(unique int node: @documentable ref, int comment: @comment_group ref); + +#keyset[parent, idx] +exprs(unique int id: @expr, int kind: int ref, int parent: @exprparent ref, int idx: int ref); + +literals(unique int expr: @expr ref, string value: string ref, string raw: string ref); + +constvalues(unique int expr: @expr ref, string value: string ref, string exact: string ref); + +fields(unique int id: @field, int parent: @fieldparent ref, int idx: int ref); + +typeparamdecls(unique int id: @typeparamdecl, int parent: @typeparamdeclparent ref, int idx: int ref); + +#keyset[parent, idx] +stmts(unique int id: @stmt, int kind: int ref, int parent: @stmtparent ref, int idx: int ref); + +#keyset[parent, idx] +decls(unique int id: @decl, int kind: int ref, int parent: @declparent ref, int idx: int ref); + +#keyset[parent, idx] +specs(unique int id: @spec, int kind: int ref, int parent: @gendecl ref, int idx: int ref); + +scopes(unique int id: @scope, int kind: int ref); + +scopenesting(unique int inner: @scope ref, int outer: @scope ref); + +scopenodes(unique int node: @scopenode ref, int scope: @localscope ref); + +objects(unique int id: @object, int kind: int ref, string name: string ref); + +objectscopes(unique int object: @object ref, int scope: @scope ref); + +objecttypes(unique int object: @object ref, int tp: @type ref); + +methodreceivers(unique int method: @object ref, int receiver: @object ref); + +fieldstructs(unique int field: @object ref, int struct: @structtype ref); + +methodhosts(int method: @object ref, int host: @definedtype ref); + +defs(int ident: @ident ref, int object: @object ref); + +uses(int ident: @ident ref, int object: @object ref); + +types(unique int id: @type, int kind: int ref); + +type_of(unique int expr: @expr ref, int tp: @type ref); + +typename(unique int tp: @type ref, string name: string ref); + +key_type(unique int map: @maptype ref, int tp: @type ref); + +element_type(unique int container: @containertype ref, int tp: @type ref); + +base_type(unique int ptr: @pointertype ref, int tp: @type ref); + +underlying_type(unique int defined: @definedtype ref, int tp: @type ref); + +#keyset[parent, index] +component_types(int parent: @compositetype ref, int index: int ref, string name: string ref, int tp: @type ref); + +#keyset[parent, index] +struct_tags(int parent: @structtype ref, int index: int ref, string tag: string ref); + +#keyset[interface, index] +interface_private_method_ids(int interface: @interfacetype ref, int index: int ref, string id: string ref); + +array_length(unique int tp: @arraytype ref, string len: string ref); + +type_objects(unique int tp: @type ref, int object: @object ref); + +packages(unique int id: @package, string name: string ref, string path: string ref, int scope: @packagescope ref); + +#keyset[parent, idx] +modexprs(unique int id: @modexpr, int kind: int ref, int parent: @modexprparent ref, int idx: int ref); + +#keyset[parent, idx] +modtokens(string token: string ref, int parent: @modexpr ref, int idx: int ref); + +#keyset[package, idx] +errors(unique int id: @error, int kind: int ref, string msg: string ref, string rawpos: string ref, + string file: string ref, int line: int ref, int col: int ref, int package: @package ref, int idx: int ref); + +has_ellipsis(int id: @callorconversionexpr ref); + +variadic(int id: @signaturetype ref); + +#keyset[parent, idx] +typeparam(unique int tp: @typeparamtype ref, string name: string ref, int bound: @compositetype ref, + int parent: @typeparamparentobject ref, int idx: int ref); + +@container = @file | @folder; + +@locatable = @xmllocatable | @node | @localscope; + +@node = @documentable | @exprparent | @modexprparent | @fieldparent | @stmtparent | @declparent | @typeparamdeclparent + | @scopenode | @comment_group | @comment; + +@documentable = @file | @field | @typeparamdecl | @spec | @gendecl | @funcdecl | @modexpr; + +@exprparent = @funcdef | @file | @expr | @field | @stmt | @decl | @typeparamdecl | @spec; + +@modexprparent = @file | @modexpr; + +@fieldparent = @decl | @structtypeexpr | @functypeexpr | @interfacetypeexpr; + +@stmtparent = @funcdef | @stmt | @decl; + +@declparent = @file | @declstmt; + +@typeparamdeclparent = @funcdecl | @typespec; + +@funcdef = @funclit | @funcdecl; + +@scopenode = @file | @functypeexpr | @blockstmt | @ifstmt | @caseclause | @switchstmt | @commclause | @loopstmt; + +@location = @location_default; + +@sourceline = @locatable; + +case @comment.kind of + 0 = @slashslashcomment +| 1 = @slashstarcomment; + +case @expr.kind of + 0 = @badexpr +| 1 = @ident +| 2 = @ellipsis +| 3 = @intlit +| 4 = @floatlit +| 5 = @imaglit +| 6 = @charlit +| 7 = @stringlit +| 8 = @funclit +| 9 = @compositelit +| 10 = @parenexpr +| 11 = @selectorexpr +| 12 = @indexexpr +| 13 = @genericfunctioninstantiationexpr +| 14 = @generictypeinstantiationexpr +| 15 = @sliceexpr +| 16 = @typeassertexpr +| 17 = @callorconversionexpr +| 18 = @starexpr +| 19 = @keyvalueexpr +| 20 = @arraytypeexpr +| 21 = @structtypeexpr +| 22 = @functypeexpr +| 23 = @interfacetypeexpr +| 24 = @maptypeexpr +| 25 = @typesetliteralexpr +| 26 = @plusexpr +| 27 = @minusexpr +| 28 = @notexpr +| 29 = @complementexpr +| 30 = @derefexpr +| 31 = @addressexpr +| 32 = @arrowexpr +| 33 = @lorexpr +| 34 = @landexpr +| 35 = @eqlexpr +| 36 = @neqexpr +| 37 = @lssexpr +| 38 = @leqexpr +| 39 = @gtrexpr +| 40 = @geqexpr +| 41 = @addexpr +| 42 = @subexpr +| 43 = @orexpr +| 44 = @xorexpr +| 45 = @mulexpr +| 46 = @quoexpr +| 47 = @remexpr +| 48 = @shlexpr +| 49 = @shrexpr +| 50 = @andexpr +| 51 = @andnotexpr +| 52 = @sendchantypeexpr +| 53 = @recvchantypeexpr +| 54 = @sendrcvchantypeexpr; + +@basiclit = @intlit | @floatlit | @imaglit | @charlit | @stringlit; + +@operatorexpr = @logicalexpr | @arithmeticexpr | @bitwiseexpr | @unaryexpr | @binaryexpr; + +@logicalexpr = @logicalunaryexpr | @logicalbinaryexpr; + +@arithmeticexpr = @arithmeticunaryexpr | @arithmeticbinaryexpr; + +@bitwiseexpr = @bitwiseunaryexpr | @bitwisebinaryexpr; + +@unaryexpr = @logicalunaryexpr | @bitwiseunaryexpr | @arithmeticunaryexpr | @derefexpr | @addressexpr | @arrowexpr; + +@logicalunaryexpr = @notexpr; + +@bitwiseunaryexpr = @complementexpr; + +@arithmeticunaryexpr = @plusexpr | @minusexpr; + +@binaryexpr = @logicalbinaryexpr | @bitwisebinaryexpr | @arithmeticbinaryexpr | @comparison; + +@logicalbinaryexpr = @lorexpr | @landexpr; + +@bitwisebinaryexpr = @shiftexpr | @orexpr | @xorexpr | @andexpr | @andnotexpr; + +@arithmeticbinaryexpr = @addexpr | @subexpr | @mulexpr | @quoexpr | @remexpr; + +@shiftexpr = @shlexpr | @shrexpr; + +@comparison = @equalitytest | @relationalcomparison; + +@equalitytest = @eqlexpr | @neqexpr; + +@relationalcomparison = @lssexpr | @leqexpr | @gtrexpr | @geqexpr; + +@chantypeexpr = @sendchantypeexpr | @recvchantypeexpr | @sendrcvchantypeexpr; + +case @stmt.kind of + 0 = @badstmt +| 1 = @declstmt +| 2 = @emptystmt +| 3 = @labeledstmt +| 4 = @exprstmt +| 5 = @sendstmt +| 6 = @incstmt +| 7 = @decstmt +| 8 = @gostmt +| 9 = @deferstmt +| 10 = @returnstmt +| 11 = @breakstmt +| 12 = @continuestmt +| 13 = @gotostmt +| 14 = @fallthroughstmt +| 15 = @blockstmt +| 16 = @ifstmt +| 17 = @caseclause +| 18 = @exprswitchstmt +| 19 = @typeswitchstmt +| 20 = @commclause +| 21 = @selectstmt +| 22 = @forstmt +| 23 = @rangestmt +| 24 = @assignstmt +| 25 = @definestmt +| 26 = @addassignstmt +| 27 = @subassignstmt +| 28 = @mulassignstmt +| 29 = @quoassignstmt +| 30 = @remassignstmt +| 31 = @andassignstmt +| 32 = @orassignstmt +| 33 = @xorassignstmt +| 34 = @shlassignstmt +| 35 = @shrassignstmt +| 36 = @andnotassignstmt; + +@incdecstmt = @incstmt | @decstmt; + +@assignment = @simpleassignstmt | @compoundassignstmt; + +@simpleassignstmt = @assignstmt | @definestmt; + +@compoundassignstmt = @addassignstmt | @subassignstmt | @mulassignstmt | @quoassignstmt | @remassignstmt + | @andassignstmt | @orassignstmt | @xorassignstmt | @shlassignstmt | @shrassignstmt | @andnotassignstmt; + +@branchstmt = @breakstmt | @continuestmt | @gotostmt | @fallthroughstmt; + +@switchstmt = @exprswitchstmt | @typeswitchstmt; + +@loopstmt = @forstmt | @rangestmt; + +case @decl.kind of + 0 = @baddecl +| 1 = @importdecl +| 2 = @constdecl +| 3 = @typedecl +| 4 = @vardecl +| 5 = @funcdecl; + +@gendecl = @importdecl | @constdecl | @typedecl | @vardecl; + +case @spec.kind of + 0 = @importspec +| 1 = @valuespec +| 2 = @typedefspec +| 3 = @aliasspec; + +@typespec = @typedefspec | @aliasspec; + +case @object.kind of + 0 = @pkgobject +| 1 = @decltypeobject +| 2 = @builtintypeobject +| 3 = @declconstobject +| 4 = @builtinconstobject +| 5 = @declvarobject +| 6 = @declfunctionobject +| 7 = @builtinfunctionobject +| 8 = @labelobject; + +@typeparamparentobject = @decltypeobject | @declfunctionobject; + +@declobject = @decltypeobject | @declconstobject | @declvarobject | @declfunctionobject; + +@builtinobject = @builtintypeobject | @builtinconstobject | @builtinfunctionobject; + +@typeobject = @decltypeobject | @builtintypeobject; + +@valueobject = @constobject | @varobject | @functionobject; + +@constobject = @declconstobject | @builtinconstobject; + +@varobject = @declvarobject; + +@functionobject = @declfunctionobject | @builtinfunctionobject; + +case @scope.kind of + 0 = @universescope +| 1 = @packagescope +| 2 = @localscope; + +case @type.kind of + 0 = @invalidtype +| 1 = @boolexprtype +| 2 = @inttype +| 3 = @int8type +| 4 = @int16type +| 5 = @int32type +| 6 = @int64type +| 7 = @uinttype +| 8 = @uint8type +| 9 = @uint16type +| 10 = @uint32type +| 11 = @uint64type +| 12 = @uintptrtype +| 13 = @float32type +| 14 = @float64type +| 15 = @complex64type +| 16 = @complex128type +| 17 = @stringexprtype +| 18 = @unsafepointertype +| 19 = @boolliteraltype +| 20 = @intliteraltype +| 21 = @runeliteraltype +| 22 = @floatliteraltype +| 23 = @complexliteraltype +| 24 = @stringliteraltype +| 25 = @nilliteraltype +| 26 = @typeparamtype +| 27 = @arraytype +| 28 = @slicetype +| 29 = @structtype +| 30 = @pointertype +| 31 = @interfacetype +| 32 = @tupletype +| 33 = @signaturetype +| 34 = @maptype +| 35 = @sendchantype +| 36 = @recvchantype +| 37 = @sendrcvchantype +| 38 = @definedtype +| 39 = @typesetliteraltype; + +@basictype = @booltype | @numerictype | @stringtype | @literaltype | @invalidtype | @unsafepointertype; + +@booltype = @boolexprtype | @boolliteraltype; + +@numerictype = @integertype | @floattype | @complextype; + +@integertype = @signedintegertype | @unsignedintegertype; + +@signedintegertype = @inttype | @int8type | @int16type | @int32type | @int64type | @intliteraltype | @runeliteraltype; + +@unsignedintegertype = @uinttype | @uint8type | @uint16type | @uint32type | @uint64type | @uintptrtype; + +@floattype = @float32type | @float64type | @floatliteraltype; + +@complextype = @complex64type | @complex128type | @complexliteraltype; + +@stringtype = @stringexprtype | @stringliteraltype; + +@literaltype = @boolliteraltype | @intliteraltype | @runeliteraltype | @floatliteraltype | @complexliteraltype + | @stringliteraltype | @nilliteraltype; + +@compositetype = @typeparamtype | @containertype | @structtype | @pointertype | @interfacetype | @tupletype + | @signaturetype | @definedtype | @typesetliteraltype; + +@containertype = @arraytype | @slicetype | @maptype | @chantype; + +@chantype = @sendchantype | @recvchantype | @sendrcvchantype; + +case @modexpr.kind of + 0 = @modcommentblock +| 1 = @modline +| 2 = @modlineblock +| 3 = @modlparen +| 4 = @modrparen; + +case @error.kind of + 0 = @unknownerror +| 1 = @listerror +| 2 = @parseerror +| 3 = @typeerror; + diff --git a/go/ql/lib/upgrades/4bd57e093275e5e892dfb16b55ed4bd76ea662be/old.dbscheme b/go/ql/lib/upgrades/4bd57e093275e5e892dfb16b55ed4bd76ea662be/old.dbscheme new file mode 100644 index 000000000000..4bd57e093275 --- /dev/null +++ b/go/ql/lib/upgrades/4bd57e093275e5e892dfb16b55ed4bd76ea662be/old.dbscheme @@ -0,0 +1,552 @@ +/** Auto-generated dbscheme; do not edit. Run `make gen` in directory `go/` to regenerate. */ + + +/** Duplicate code **/ + +duplicateCode( + unique int id : @duplication, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +similarCode( + unique int id : @similarity, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +@duplication_or_similarity = @duplication | @similarity; + +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref); + +/** External data **/ + +externalData( + int id : @externalDataElement, + varchar(900) path : string ref, + int column: int ref, + varchar(900) value : string ref +); + +snapshotDate(unique date snapshotDate : date ref); + +sourceLocationPrefix(varchar(900) prefix : string ref); + + +/* + * XML Files + */ + +xmlEncoding( + unique int id: @file ref, + string encoding: string ref +); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +compilations(unique int id: @compilation, string cwd: string ref); + +#keyset[id, num] +compilation_args(int id: @compilation ref, int num: int ref, string arg: string ref); + +#keyset[id, num, kind] +compilation_time(int id: @compilation ref, int num: int ref, int kind: int ref, float secs: float ref); + +diagnostic_for(unique int diagnostic: @diagnostic ref, int compilation: @compilation ref, int file_number: int ref, int file_number_diagnostic_number: int ref); + +compilation_finished(unique int id: @compilation ref, float cpu_seconds: float ref, float elapsed_seconds: float ref); + +#keyset[id, num] +compilation_compiling_files(int id: @compilation ref, int num: int ref, int file: @file ref); + +diagnostics(unique int id: @diagnostic, int severity: int ref, string error_tag: string ref, string error_message: string ref, + string full_error_message: string ref, int location: @location ref); + +locations_default(unique int id: @location_default, int file: @file ref, int beginLine: int ref, int beginColumn: int ref, + int endLine: int ref, int endColumn: int ref); + +numlines(int element_id: @sourceline ref, int num_lines: int ref, int num_code: int ref, int num_comment: int ref); + +files(unique int id: @file, string name: string ref); + +folders(unique int id: @folder, string name: string ref); + +containerparent(int parent: @container ref, unique int child: @container ref); + +has_location(unique int locatable: @locatable ref, int location: @location ref); + +#keyset[parent, idx] +comment_groups(unique int id: @comment_group, int parent: @file ref, int idx: int ref); + +comments(unique int id: @comment, int kind: int ref, int parent: @comment_group ref, int idx: int ref, string text: string ref); + +doc_comments(unique int node: @documentable ref, int comment: @comment_group ref); + +#keyset[parent, idx] +exprs(unique int id: @expr, int kind: int ref, int parent: @exprparent ref, int idx: int ref); + +literals(unique int expr: @expr ref, string value: string ref, string raw: string ref); + +constvalues(unique int expr: @expr ref, string value: string ref, string exact: string ref); + +fields(unique int id: @field, int parent: @fieldparent ref, int idx: int ref); + +typeparamdecls(unique int id: @typeparamdecl, int parent: @typeparamdeclparent ref, int idx: int ref); + +#keyset[parent, idx] +stmts(unique int id: @stmt, int kind: int ref, int parent: @stmtparent ref, int idx: int ref); + +#keyset[parent, idx] +decls(unique int id: @decl, int kind: int ref, int parent: @declparent ref, int idx: int ref); + +#keyset[parent, idx] +specs(unique int id: @spec, int kind: int ref, int parent: @gendecl ref, int idx: int ref); + +scopes(unique int id: @scope, int kind: int ref); + +scopenesting(unique int inner: @scope ref, int outer: @scope ref); + +scopenodes(unique int node: @scopenode ref, int scope: @localscope ref); + +objects(unique int id: @object, int kind: int ref, string name: string ref); + +objectscopes(unique int object: @object ref, int scope: @scope ref); + +objecttypes(unique int object: @object ref, int tp: @type ref); + +methodreceivers(unique int method: @object ref, int receiver: @object ref); + +fieldstructs(unique int field: @object ref, int struct: @structtype ref); + +methodhosts(int method: @object ref, int host: @namedtype ref); + +defs(int ident: @ident ref, int object: @object ref); + +uses(int ident: @ident ref, int object: @object ref); + +types(unique int id: @type, int kind: int ref); + +type_of(unique int expr: @expr ref, int tp: @type ref); + +typename(unique int tp: @type ref, string name: string ref); + +key_type(unique int map: @maptype ref, int tp: @type ref); + +element_type(unique int container: @containertype ref, int tp: @type ref); + +base_type(unique int ptr: @pointertype ref, int tp: @type ref); + +underlying_type(unique int named: @namedtype ref, int tp: @type ref); + +#keyset[parent, index] +component_types(int parent: @compositetype ref, int index: int ref, string name: string ref, int tp: @type ref); + +#keyset[parent, index] +struct_tags(int parent: @structtype ref, int index: int ref, string tag: string ref); + +#keyset[interface, index] +interface_private_method_ids(int interface: @interfacetype ref, int index: int ref, string id: string ref); + +array_length(unique int tp: @arraytype ref, string len: string ref); + +type_objects(unique int tp: @type ref, int object: @object ref); + +packages(unique int id: @package, string name: string ref, string path: string ref, int scope: @packagescope ref); + +#keyset[parent, idx] +modexprs(unique int id: @modexpr, int kind: int ref, int parent: @modexprparent ref, int idx: int ref); + +#keyset[parent, idx] +modtokens(string token: string ref, int parent: @modexpr ref, int idx: int ref); + +#keyset[package, idx] +errors(unique int id: @error, int kind: int ref, string msg: string ref, string rawpos: string ref, + string file: string ref, int line: int ref, int col: int ref, int package: @package ref, int idx: int ref); + +has_ellipsis(int id: @callorconversionexpr ref); + +variadic(int id: @signaturetype ref); + +#keyset[parent, idx] +typeparam(unique int tp: @typeparamtype ref, string name: string ref, int bound: @compositetype ref, + int parent: @typeparamparentobject ref, int idx: int ref); + +@container = @file | @folder; + +@locatable = @xmllocatable | @node | @localscope; + +@node = @documentable | @exprparent | @modexprparent | @fieldparent | @stmtparent | @declparent | @typeparamdeclparent + | @scopenode | @comment_group | @comment; + +@documentable = @file | @field | @typeparamdecl | @spec | @gendecl | @funcdecl | @modexpr; + +@exprparent = @funcdef | @file | @expr | @field | @stmt | @decl | @typeparamdecl | @spec; + +@modexprparent = @file | @modexpr; + +@fieldparent = @decl | @structtypeexpr | @functypeexpr | @interfacetypeexpr; + +@stmtparent = @funcdef | @stmt | @decl; + +@declparent = @file | @declstmt; + +@typeparamdeclparent = @funcdecl | @typespec; + +@funcdef = @funclit | @funcdecl; + +@scopenode = @file | @functypeexpr | @blockstmt | @ifstmt | @caseclause | @switchstmt | @commclause | @loopstmt; + +@location = @location_default; + +@sourceline = @locatable; + +case @comment.kind of + 0 = @slashslashcomment +| 1 = @slashstarcomment; + +case @expr.kind of + 0 = @badexpr +| 1 = @ident +| 2 = @ellipsis +| 3 = @intlit +| 4 = @floatlit +| 5 = @imaglit +| 6 = @charlit +| 7 = @stringlit +| 8 = @funclit +| 9 = @compositelit +| 10 = @parenexpr +| 11 = @selectorexpr +| 12 = @indexexpr +| 13 = @genericfunctioninstantiationexpr +| 14 = @generictypeinstantiationexpr +| 15 = @sliceexpr +| 16 = @typeassertexpr +| 17 = @callorconversionexpr +| 18 = @starexpr +| 19 = @keyvalueexpr +| 20 = @arraytypeexpr +| 21 = @structtypeexpr +| 22 = @functypeexpr +| 23 = @interfacetypeexpr +| 24 = @maptypeexpr +| 25 = @typesetliteralexpr +| 26 = @plusexpr +| 27 = @minusexpr +| 28 = @notexpr +| 29 = @complementexpr +| 30 = @derefexpr +| 31 = @addressexpr +| 32 = @arrowexpr +| 33 = @lorexpr +| 34 = @landexpr +| 35 = @eqlexpr +| 36 = @neqexpr +| 37 = @lssexpr +| 38 = @leqexpr +| 39 = @gtrexpr +| 40 = @geqexpr +| 41 = @addexpr +| 42 = @subexpr +| 43 = @orexpr +| 44 = @xorexpr +| 45 = @mulexpr +| 46 = @quoexpr +| 47 = @remexpr +| 48 = @shlexpr +| 49 = @shrexpr +| 50 = @andexpr +| 51 = @andnotexpr +| 52 = @sendchantypeexpr +| 53 = @recvchantypeexpr +| 54 = @sendrcvchantypeexpr; + +@basiclit = @intlit | @floatlit | @imaglit | @charlit | @stringlit; + +@operatorexpr = @logicalexpr | @arithmeticexpr | @bitwiseexpr | @unaryexpr | @binaryexpr; + +@logicalexpr = @logicalunaryexpr | @logicalbinaryexpr; + +@arithmeticexpr = @arithmeticunaryexpr | @arithmeticbinaryexpr; + +@bitwiseexpr = @bitwiseunaryexpr | @bitwisebinaryexpr; + +@unaryexpr = @logicalunaryexpr | @bitwiseunaryexpr | @arithmeticunaryexpr | @derefexpr | @addressexpr | @arrowexpr; + +@logicalunaryexpr = @notexpr; + +@bitwiseunaryexpr = @complementexpr; + +@arithmeticunaryexpr = @plusexpr | @minusexpr; + +@binaryexpr = @logicalbinaryexpr | @bitwisebinaryexpr | @arithmeticbinaryexpr | @comparison; + +@logicalbinaryexpr = @lorexpr | @landexpr; + +@bitwisebinaryexpr = @shiftexpr | @orexpr | @xorexpr | @andexpr | @andnotexpr; + +@arithmeticbinaryexpr = @addexpr | @subexpr | @mulexpr | @quoexpr | @remexpr; + +@shiftexpr = @shlexpr | @shrexpr; + +@comparison = @equalitytest | @relationalcomparison; + +@equalitytest = @eqlexpr | @neqexpr; + +@relationalcomparison = @lssexpr | @leqexpr | @gtrexpr | @geqexpr; + +@chantypeexpr = @sendchantypeexpr | @recvchantypeexpr | @sendrcvchantypeexpr; + +case @stmt.kind of + 0 = @badstmt +| 1 = @declstmt +| 2 = @emptystmt +| 3 = @labeledstmt +| 4 = @exprstmt +| 5 = @sendstmt +| 6 = @incstmt +| 7 = @decstmt +| 8 = @gostmt +| 9 = @deferstmt +| 10 = @returnstmt +| 11 = @breakstmt +| 12 = @continuestmt +| 13 = @gotostmt +| 14 = @fallthroughstmt +| 15 = @blockstmt +| 16 = @ifstmt +| 17 = @caseclause +| 18 = @exprswitchstmt +| 19 = @typeswitchstmt +| 20 = @commclause +| 21 = @selectstmt +| 22 = @forstmt +| 23 = @rangestmt +| 24 = @assignstmt +| 25 = @definestmt +| 26 = @addassignstmt +| 27 = @subassignstmt +| 28 = @mulassignstmt +| 29 = @quoassignstmt +| 30 = @remassignstmt +| 31 = @andassignstmt +| 32 = @orassignstmt +| 33 = @xorassignstmt +| 34 = @shlassignstmt +| 35 = @shrassignstmt +| 36 = @andnotassignstmt; + +@incdecstmt = @incstmt | @decstmt; + +@assignment = @simpleassignstmt | @compoundassignstmt; + +@simpleassignstmt = @assignstmt | @definestmt; + +@compoundassignstmt = @addassignstmt | @subassignstmt | @mulassignstmt | @quoassignstmt | @remassignstmt + | @andassignstmt | @orassignstmt | @xorassignstmt | @shlassignstmt | @shrassignstmt | @andnotassignstmt; + +@branchstmt = @breakstmt | @continuestmt | @gotostmt | @fallthroughstmt; + +@switchstmt = @exprswitchstmt | @typeswitchstmt; + +@loopstmt = @forstmt | @rangestmt; + +case @decl.kind of + 0 = @baddecl +| 1 = @importdecl +| 2 = @constdecl +| 3 = @typedecl +| 4 = @vardecl +| 5 = @funcdecl; + +@gendecl = @importdecl | @constdecl | @typedecl | @vardecl; + +case @spec.kind of + 0 = @importspec +| 1 = @valuespec +| 2 = @typedefspec +| 3 = @aliasspec; + +@typespec = @typedefspec | @aliasspec; + +case @object.kind of + 0 = @pkgobject +| 1 = @decltypeobject +| 2 = @builtintypeobject +| 3 = @declconstobject +| 4 = @builtinconstobject +| 5 = @declvarobject +| 6 = @declfunctionobject +| 7 = @builtinfunctionobject +| 8 = @labelobject; + +@typeparamparentobject = @decltypeobject | @declfunctionobject; + +@declobject = @decltypeobject | @declconstobject | @declvarobject | @declfunctionobject; + +@builtinobject = @builtintypeobject | @builtinconstobject | @builtinfunctionobject; + +@typeobject = @decltypeobject | @builtintypeobject; + +@valueobject = @constobject | @varobject | @functionobject; + +@constobject = @declconstobject | @builtinconstobject; + +@varobject = @declvarobject; + +@functionobject = @declfunctionobject | @builtinfunctionobject; + +case @scope.kind of + 0 = @universescope +| 1 = @packagescope +| 2 = @localscope; + +case @type.kind of + 0 = @invalidtype +| 1 = @boolexprtype +| 2 = @inttype +| 3 = @int8type +| 4 = @int16type +| 5 = @int32type +| 6 = @int64type +| 7 = @uinttype +| 8 = @uint8type +| 9 = @uint16type +| 10 = @uint32type +| 11 = @uint64type +| 12 = @uintptrtype +| 13 = @float32type +| 14 = @float64type +| 15 = @complex64type +| 16 = @complex128type +| 17 = @stringexprtype +| 18 = @unsafepointertype +| 19 = @boolliteraltype +| 20 = @intliteraltype +| 21 = @runeliteraltype +| 22 = @floatliteraltype +| 23 = @complexliteraltype +| 24 = @stringliteraltype +| 25 = @nilliteraltype +| 26 = @typeparamtype +| 27 = @arraytype +| 28 = @slicetype +| 29 = @structtype +| 30 = @pointertype +| 31 = @interfacetype +| 32 = @tupletype +| 33 = @signaturetype +| 34 = @maptype +| 35 = @sendchantype +| 36 = @recvchantype +| 37 = @sendrcvchantype +| 38 = @namedtype +| 39 = @typesetliteraltype; + +@basictype = @booltype | @numerictype | @stringtype | @literaltype | @invalidtype | @unsafepointertype; + +@booltype = @boolexprtype | @boolliteraltype; + +@numerictype = @integertype | @floattype | @complextype; + +@integertype = @signedintegertype | @unsignedintegertype; + +@signedintegertype = @inttype | @int8type | @int16type | @int32type | @int64type | @intliteraltype | @runeliteraltype; + +@unsignedintegertype = @uinttype | @uint8type | @uint16type | @uint32type | @uint64type | @uintptrtype; + +@floattype = @float32type | @float64type | @floatliteraltype; + +@complextype = @complex64type | @complex128type | @complexliteraltype; + +@stringtype = @stringexprtype | @stringliteraltype; + +@literaltype = @boolliteraltype | @intliteraltype | @runeliteraltype | @floatliteraltype | @complexliteraltype + | @stringliteraltype | @nilliteraltype; + +@compositetype = @typeparamtype | @containertype | @structtype | @pointertype | @interfacetype | @tupletype + | @signaturetype | @namedtype | @typesetliteraltype; + +@containertype = @arraytype | @slicetype | @maptype | @chantype; + +@chantype = @sendchantype | @recvchantype | @sendrcvchantype; + +case @modexpr.kind of + 0 = @modcommentblock +| 1 = @modline +| 2 = @modlineblock +| 3 = @modlparen +| 4 = @modrparen; + +case @error.kind of + 0 = @unknownerror +| 1 = @listerror +| 2 = @parseerror +| 3 = @typeerror; + diff --git a/go/ql/lib/upgrades/4bd57e093275e5e892dfb16b55ed4bd76ea662be/upgrade.properties b/go/ql/lib/upgrades/4bd57e093275e5e892dfb16b55ed4bd76ea662be/upgrade.properties new file mode 100644 index 000000000000..64da53384a51 --- /dev/null +++ b/go/ql/lib/upgrades/4bd57e093275e5e892dfb16b55ed4bd76ea662be/upgrade.properties @@ -0,0 +1,2 @@ +description: +compatibility: full|backwards|partial|breaking From f9a87cd0eaaeed7b2b33b00717145cddbf44af37 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 13 Feb 2025 16:19:51 +0000 Subject: [PATCH 5/6] Rename "namedtype" to "definedtype" in stats file --- go/ql/lib/go.dbscheme.stats | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/ql/lib/go.dbscheme.stats b/go/ql/lib/go.dbscheme.stats index a602a143ee0c..126bbff00f7f 100644 --- a/go/ql/lib/go.dbscheme.stats +++ b/go/ql/lib/go.dbscheme.stats @@ -681,7 +681,7 @@ 101202 - @namedtype + @definedtype 12852686 From 1a52398a291367f9f4217edf21aa9c97242ef5c9 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 13 Feb 2025 21:50:47 +0000 Subject: [PATCH 6/6] Address review comments --- .../upgrade.properties | 4 ++-- go/ql/lib/semmle/go/Scopes.qll | 4 ++-- .../upgrade.properties | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go/downgrades/b3da71c3ac204b557c86e9d9c26012360bdbdccb/upgrade.properties b/go/downgrades/b3da71c3ac204b557c86e9d9c26012360bdbdccb/upgrade.properties index 64da53384a51..73db35e7e1b3 100644 --- a/go/downgrades/b3da71c3ac204b557c86e9d9c26012360bdbdccb/upgrade.properties +++ b/go/downgrades/b3da71c3ac204b557c86e9d9c26012360bdbdccb/upgrade.properties @@ -1,2 +1,2 @@ -description: -compatibility: full|backwards|partial|breaking +description: Rename @definedtype to @namedtype +compatibility: full diff --git a/go/ql/lib/semmle/go/Scopes.qll b/go/ql/lib/semmle/go/Scopes.qll index 0ca97acf86ce..edea24c184fc 100644 --- a/go/ql/lib/semmle/go/Scopes.qll +++ b/go/ql/lib/semmle/go/Scopes.qll @@ -195,8 +195,8 @@ class BuiltinEntity extends Entity, @builtinobject { } class PackageEntity extends Entity, @pkgobject { } /** - * A named type (predeclared types, defined types, type parameters and aliases - * which refer to those things). + * A named type: predeclared types, defined types, type parameters, and type + * aliases. */ class TypeEntity extends Entity, @typeobject { } diff --git a/go/ql/lib/upgrades/4bd57e093275e5e892dfb16b55ed4bd76ea662be/upgrade.properties b/go/ql/lib/upgrades/4bd57e093275e5e892dfb16b55ed4bd76ea662be/upgrade.properties index 64da53384a51..ca2da0c9fc78 100644 --- a/go/ql/lib/upgrades/4bd57e093275e5e892dfb16b55ed4bd76ea662be/upgrade.properties +++ b/go/ql/lib/upgrades/4bd57e093275e5e892dfb16b55ed4bd76ea662be/upgrade.properties @@ -1,2 +1,2 @@ -description: -compatibility: full|backwards|partial|breaking +description: Rename @namedtype to @definedtype +compatibility: full