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 : "");