diff --git a/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/WindowsApiRun.java b/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/WindowsApiRun.java index b52e810..8ca1bbe 100644 --- a/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/WindowsApiRun.java +++ b/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/WindowsApiRun.java @@ -22,7 +22,7 @@ import java.nio.file.attribute.BasicFileAttributes; import java.util.ArrayDeque; import java.util.Deque; -import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.Set; /** @@ -44,12 +44,12 @@ public class WindowsApiRun { private String basePackage = ""; private EventListener eventListener = new NullEventListener(); - private Set structs = new HashSet<>(); - private Set functions = new HashSet<>(); - private Set enumerations = new HashSet<>(); - private Set callbackFunctions = new HashSet<>(); - private Set comInterfaces = new HashSet<>(); - private Set constants = new HashSet<>(); + private Set structs = new LinkedHashSet<>(); + private Set functions = new LinkedHashSet<>(); + private Set enumerations = new LinkedHashSet<>(); + private Set callbackFunctions = new LinkedHashSet<>(); + private Set comInterfaces = new LinkedHashSet<>(); + private Set constants = new LinkedHashSet<>(); /** * Creates a new instance. diff --git a/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/metadata/Metadata.java b/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/metadata/Metadata.java index eca9cb3..df719d5 100644 --- a/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/metadata/Metadata.java +++ b/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/metadata/Metadata.java @@ -8,7 +8,7 @@ import java.util.ArrayList; import java.util.Arrays; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -25,13 +25,13 @@ */ @SuppressWarnings({"java:S4274", "java:S1192"}) public class Metadata { - private final Map namespaces = new HashMap<>(); + private final Map namespaces = new LinkedHashMap<>(); private final Namespace unnamedNamespace = new Namespace(null); - private final Map typesByDefinitionIndex = new HashMap<>(); - private final Map methodsByMethodDefIndex = new HashMap<>(); + private final Map typesByDefinitionIndex = new LinkedHashMap<>(); + private final Map methodsByMethodDefIndex = new LinkedHashMap<>(); private final Map primitivesByKind = buildPrimitiveTypes(unnamedNamespace); - private final Map pointersByType = new HashMap<>(); - private final Map aliasesByTypeDefIndex = new HashMap<>(); + private final Map pointersByType = new LinkedHashMap<>(); + private final Map aliasesByTypeDefIndex = new LinkedHashMap<>(); /** * Creates a new instance. diff --git a/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/metadata/Namespace.java b/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/metadata/Namespace.java index 0d90e8d..938f620 100644 --- a/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/metadata/Namespace.java +++ b/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/metadata/Namespace.java @@ -6,7 +6,7 @@ // package net.codecrete.windowsapi.metadata; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; /** @@ -18,9 +18,9 @@ @SuppressWarnings("java:S4274") public class Namespace { private final String name; - private final Map types = new HashMap<>(); - private final Map methods = new HashMap<>(); - private final Map constants = new HashMap<>(); + private final Map types = new LinkedHashMap<>(); + private final Map methods = new LinkedHashMap<>(); + private final Map constants = new LinkedHashMap<>(); /** * Creates a new instance. diff --git a/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/metadata/Struct.java b/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/metadata/Struct.java index dd80fe4..28fbc04 100644 --- a/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/metadata/Struct.java +++ b/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/metadata/Struct.java @@ -7,7 +7,7 @@ package net.codecrete.windowsapi.metadata; import java.util.Collection; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.UUID; @@ -143,7 +143,7 @@ public Struct enclosingType() { */ public void addNestedType(Type nestedType) { if (nestedTypes == null) - nestedTypes = new HashMap<>(); + nestedTypes = new LinkedHashMap<>(); assert !nestedTypes.containsKey(nestedType.name()); nestedTypes.put(nestedType.name(), nestedType); } diff --git a/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/winmd/MetadataBuilder.java b/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/winmd/MetadataBuilder.java index 7fe288c..a94fa4f 100644 --- a/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/winmd/MetadataBuilder.java +++ b/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/winmd/MetadataBuilder.java @@ -31,7 +31,7 @@ import java.io.IOException; import java.util.ArrayList; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -65,7 +65,7 @@ public class MetadataBuilder implements TypeLookup { private final VariantTransformation variantTransformation; private final Primitive[] primitiveTypes = new Primitive[15]; private final CustomAttributeDecoder customAttributeDecoder; - private final Map apiTypes = new HashMap<>(); + private final Map apiTypes = new LinkedHashMap<>(); private final SignatureDecoder signatureDecoder; private final Primitive intPtrType; private final Primitive uintPtrType; diff --git a/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/winmd/VariantTransformation.java b/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/winmd/VariantTransformation.java index 84e0d66..86b079a 100644 --- a/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/winmd/VariantTransformation.java +++ b/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/winmd/VariantTransformation.java @@ -17,8 +17,8 @@ import net.codecrete.windowsapi.metadata.Type; import net.codecrete.windowsapi.metadata.TypeAlias; -import java.util.HashMap; -import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.Map; import java.util.Objects; import java.util.Set; @@ -45,8 +45,8 @@ class VariantTransformation { private static final int ARM64_OFFSET = 1000000; private final Metadata metadata; - private final HashMap> typeVariants = new HashMap<>(); - private final Set unsupportedVariants = new HashSet<>(); + private final Map> typeVariants = new LinkedHashMap<>(); + private final Set unsupportedVariants = new LinkedHashSet<>(); VariantTransformation(Metadata metadata) { this.metadata = metadata; @@ -77,7 +77,7 @@ boolean preprocessType(Type type, int architecture) { return false; assert type instanceof Struct || type instanceof Delegate; - var variants = typeVariants.computeIfAbsent(type.name(), k -> new HashMap<>()); + var variants = typeVariants.computeIfAbsent(type.name(), k -> new LinkedHashMap<>()); variants.put(architecture, type); if (type instanceof Struct struct) struct.setArchitectureSpecific(true); @@ -126,7 +126,7 @@ boolean preprocessMethod(Method method, int architecture) { *

*/ void splitCombinedVariants() { - var architectureSpecificCache = new HashMap(); + var architectureSpecificCache = new LinkedHashMap(); // identify types that are indirectly architecture-specific var indirectlySpecificTypes = metadata.types() @@ -136,8 +136,8 @@ void splitCombinedVariants() { .map(Struct.class::cast) .collect(Collectors.toSet()); - var x64Replacements = new HashMap(); - var arm64Replacements = new HashMap(); + var x64Replacements = new LinkedHashMap(); + var arm64Replacements = new LinkedHashMap(); // create two separate variants for each indirectly architecture-specific type for (var type : indirectlySpecificTypes) { diff --git a/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/writer/AddressLayout.java b/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/writer/AddressLayout.java index db391da..b837d62 100644 --- a/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/writer/AddressLayout.java +++ b/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/writer/AddressLayout.java @@ -20,7 +20,7 @@ import java.util.ArrayList; import java.util.Collection; -import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Set; @@ -129,7 +129,7 @@ boolean isForStruct() { * @return the required address layouts */ static List requiredLayouts(Struct struct) { - var addressLayouts = new HashSet(); + var addressLayouts = new LinkedHashSet(); addLayoutsRecursively(struct, struct.packageSize(), addressLayouts); return filteredAndSorted(addressLayouts); } @@ -141,7 +141,7 @@ static List requiredLayouts(Struct struct) { * @return the required address layouts */ static List requiredLayouts(Collection functions) { - var addressLayouts = new HashSet(); + var addressLayouts = new LinkedHashSet(); functions.stream().flatMap(Method::referencedTypes).forEach(it -> addLayout(it, addressLayouts)); return filteredAndSorted(addressLayouts); } diff --git a/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/writer/CodeWriter.java b/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/writer/CodeWriter.java index ae13633..56c8cda 100644 --- a/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/writer/CodeWriter.java +++ b/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/writer/CodeWriter.java @@ -22,7 +22,7 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; -import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.Set; /** @@ -135,7 +135,7 @@ public void setDryRun(boolean isDryRun) { */ public void write(Scope scope) { if (!isDryRun) - generatedFiles = new HashSet<>(); + generatedFiles = new LinkedHashSet<>(); scope.getTransitiveTypeScope().forEach(this::writeType); scope.getFunctions().forEach(functionCodeWriter::writeFunctions); scope.getConstants().forEach(constantCodeWriter::writeConstants); diff --git a/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/writer/Scope.java b/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/writer/Scope.java index 39880c1..d896c94 100644 --- a/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/writer/Scope.java +++ b/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/writer/Scope.java @@ -19,7 +19,7 @@ import net.codecrete.windowsapi.metadata.TypeAlias; import java.util.Collection; -import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -39,10 +39,10 @@ public class Scope { private static final String ENUMERATION_MEMBER_SINGLE = "%s Enumeration \"%s\" contains a member with that name. " + "Specify the enumeration instead of the constant."; - private final Set typeSet = new HashSet<>(); - private final Set methodSet = new HashSet<>(); - private final Set constantSet = new HashSet<>(); - private final Set transitiveScope = new HashSet<>(); + private final Set typeSet = new LinkedHashSet<>(); + private final Set methodSet = new LinkedHashSet<>(); + private final Set constantSet = new LinkedHashSet<>(); + private final Set transitiveScope = new LinkedHashSet<>(); private final Metadata metadata; private final EventListener eventListener; private boolean hasInvalidArguments = false; diff --git a/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/writer/StructCodeWriter.java b/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/writer/StructCodeWriter.java index d11fb72..b8e3501 100644 --- a/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/writer/StructCodeWriter.java +++ b/windowsapi-code-generator/src/main/java/net/codecrete/windowsapi/writer/StructCodeWriter.java @@ -17,7 +17,7 @@ import net.codecrete.windowsapi.winmd.LayoutRequirement; import java.util.Comparator; -import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import java.util.regex.Pattern; @@ -520,7 +520,7 @@ private void writeStructComment() { } private static Set getUnalignedMemberStructs(Struct struct, int packageSize) { - var unalignedStructs = new HashSet(); + var unalignedStructs = new LinkedHashSet(); collectUnalignedMemberStructs(struct, packageSize, unalignedStructs); return unalignedStructs; } diff --git a/windowsapi-maven-plugin/src/main/java/net/codecrete/windowsapi/maven/WindowsApiGenerator.java b/windowsapi-maven-plugin/src/main/java/net/codecrete/windowsapi/maven/WindowsApiGenerator.java index 4cc0577..47ebf83 100644 --- a/windowsapi-maven-plugin/src/main/java/net/codecrete/windowsapi/maven/WindowsApiGenerator.java +++ b/windowsapi-maven-plugin/src/main/java/net/codecrete/windowsapi/maven/WindowsApiGenerator.java @@ -16,7 +16,7 @@ import java.io.File; import java.nio.file.Path; -import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; /** @@ -151,17 +151,17 @@ private WindowsApiRun createRun(Path sourceFolder) { run.setEventListener(new EventLogger(getLog())); if (functions != null) - run.setFunctions(new HashSet<>(functions)); + run.setFunctions(new LinkedHashSet<>(functions)); if (structs != null) - run.setStructs(new HashSet<>(structs)); + run.setStructs(new LinkedHashSet<>(structs)); if (enumerations != null) - run.setEnumerations(new HashSet<>(enumerations)); + run.setEnumerations(new LinkedHashSet<>(enumerations)); if (callbackFunctions != null) - run.setCallbackFunctions(new HashSet<>(callbackFunctions)); + run.setCallbackFunctions(new LinkedHashSet<>(callbackFunctions)); if (comInterfaces != null) - run.setComInterfaces(new HashSet<>(comInterfaces)); + run.setComInterfaces(new LinkedHashSet<>(comInterfaces)); if (constants != null) - run.setConstants(new HashSet<>(constants)); + run.setConstants(new LinkedHashSet<>(constants)); run.setOutputDirectory(sourceFolder); run.setBasePackage(basePackage != null ? basePackage : "");