// Path: source/transpiler/com/stormmq/java2c/transpiler/conversion/c/gccAttributes/GccAttribute.java
// public final class GccAttribute<N extends Enum<N> & AttributeName> implements Writable
// {
// 	@NotNull private final N name;
// 	@NotNull private final GccAttributeParameter[] gccAttributeParameters;
// 
// 	public GccAttribute(@NotNull final N name, @NotNull GccAttributeParameter... gccAttributeParameters)
// 	{
// 		this.name = name;
// 		this.gccAttributeParameters = gccAttributeParameters;
// 	}
// 
// 	public void write(@NotNull final Writer writer) throws IOException
// 	{
// 		writer.write(name.name());
// 		if (gccAttributeParameters.length != 0)
// 		{
// 			writer.write(" (");
// 			boolean afterFirst = false;
// 			for (GccAttributeParameter gccAttributeParameter : gccAttributeParameters)
// 			{
// 				if (afterFirst)
// 				{
// 					writer.write(", ");
// 				}
// 				else
// 				{
// 					afterFirst = true;
// 				}
// 				gccAttributeParameter.write(writer);
// 			}
// 			writer.write(')');
// 		}
// 	}
// }
// 
// Path: source/transpiler/com/stormmq/java2c/transpiler/conversion/c/gccAttributes/variable/GccVariableAttributeName.java
// public enum GccVariableAttributeName implements AttributeName
// {
// 	aligned,
// 	cleanup,
// 	common,
// 	nocommon,
// 	deprecated,
// 	mode,
// 	packed,
// 	section,
// 	tls_model,
// 	unused,
// 	used,
// 	vector_size,
// 	weak,
// 	;
// }
// 
// Path: source/transpiler/com/stormmq/java2c/transpiler/conversion/elementConverters/FieldAttributesProcessors.java
// @NotNull public static final FieldAttributesProcessors StaticFieldAttributesProcessors = new FieldAttributesProcessors
// (
// 	NullCheck,
// 	Deprecated,
// 	Unused,
// 	Alignment,
// 	ThreadLocalModel,
// 	Section,
// 	Packed
// );


import com.stormmq.java2c.transpiler.conversion.c.gccAttributes.GccAttribute;
import com.stormmq.java2c.transpiler.conversion.c.gccAttributes.variable.GccVariableAttributeName;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.lang.model.element.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import static com.stormmq.java2c.transpiler.conversion.elementConverters.FieldAttributesProcessors.StaticFieldAttributesProcessors;
import static java.lang.String.format;
import static java.util.Locale.ENGLISH;
import static javax.lang.model.element.Modifier.*;
				(Same as that above)
				For public static & non-literal value, we can do:
					header: extern int fieldName;
					source: int fieldName;
					void static()
					{
						any_other_static_init1();
						fieldName = NON-LITERAL
						any_other_static_init2();
					}

				Ditto for protected and none

				For private, there is (a) no extern and (b) all variables are declared with storage class STATIC

		 */
		for (VariableElement staticField : staticFields)
		{
			processStaticField(staticField);
		}
	}

	private void processStaticField(@NotNull final VariableElement staticField) throws ConversionException
	{
		final TypeResolver typeResolver = new TypeResolver();

		final String cType = typeResolver.resolveType(staticField);

		final String fieldName = classNameEscaped + '_' + staticField.getSimpleName().toString();

// Path: source/transpiler/com/stormmq/java2c/transpiler/conversion/c/gccAttributes/GccAttribute.java
// public final class GccAttribute<N extends Enum<N> & AttributeName> implements Writable
// {
// 	@NotNull private final N name;
// 	@NotNull private final GccAttributeParameter[] gccAttributeParameters;
// 
// 	public GccAttribute(@NotNull final N name, @NotNull GccAttributeParameter... gccAttributeParameters)
// 	{
// 		this.name = name;
// 		this.gccAttributeParameters = gccAttributeParameters;
// 	}
// 
// 	public void write(@NotNull final Writer writer) throws IOException
// 	{
// 		writer.write(name.name());
// 		if (gccAttributeParameters.length != 0)
// 		{
// 			writer.write(" (");
// 			boolean afterFirst = false;
// 			for (GccAttributeParameter gccAttributeParameter : gccAttributeParameters)
// 			{
// 				if (afterFirst)
// 				{
// 					writer.write(", ");
// 				}
// 				else
// 				{
// 					afterFirst = true;
// 				}
// 				gccAttributeParameter.write(writer);
// 			}
// 			writer.write(')');
// 		}
// 	}
// }
// 
// Path: source/transpiler/com/stormmq/java2c/transpiler/conversion/c/gccAttributes/variable/GccVariableAttributeName.java
// public enum GccVariableAttributeName implements AttributeName
// {
// 	aligned,
// 	cleanup,
// 	common,
// 	nocommon,
// 	deprecated,
// 	mode,
// 	packed,
// 	section,
// 	tls_model,
// 	unused,
// 	used,
// 	vector_size,
// 	weak,
// 	;
// }
// 
// Path: source/transpiler/com/stormmq/java2c/transpiler/conversion/elementConverters/FieldAttributesProcessors.java
// @NotNull public static final FieldAttributesProcessors StaticFieldAttributesProcessors = new FieldAttributesProcessors
// (
// 	NullCheck,
// 	Deprecated,
// 	Unused,
// 	Alignment,
// 	ThreadLocalModel,
// 	Section,
// 	Packed
// );


// Path: source/transpiler/com/stormmq/java2c/transpiler/conversion/elementConverters/CategorisedClassMembers.java
import com.stormmq.java2c.transpiler.conversion.c.gccAttributes.GccAttribute;
import com.stormmq.java2c.transpiler.conversion.c.gccAttributes.variable.GccVariableAttributeName;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.lang.model.element.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import static com.stormmq.java2c.transpiler.conversion.elementConverters.FieldAttributesProcessors.StaticFieldAttributesProcessors;
import static java.lang.String.format;
import static java.util.Locale.ENGLISH;
import static javax.lang.model.element.Modifier.*;

				(Same as that above)
				For public static & non-literal value, we can do:
					header: extern int fieldName;
					source: int fieldName;
					void static()
					{
						any_other_static_init1();
						fieldName = NON-LITERAL
						any_other_static_init2();
					}

				Ditto for protected and none

				For private, there is (a) no extern and (b) all variables are declared with storage class STATIC

		 */
		for (VariableElement staticField : staticFields)
		{
			processStaticField(staticField);
		}
	}

	private void processStaticField(@NotNull final VariableElement staticField) throws ConversionException
	{
		final TypeResolver typeResolver = new TypeResolver();

		final String cType = typeResolver.resolveType(staticField);

		final String fieldName = classNameEscaped + '_' + staticField.getSimpleName().toString();

		final List<GccAttribute<GccVariableAttributeName>> gccAttributes = StaticFieldAttributesProcessors.processFieldAttributes(staticField);