<?xml version="1.0"?>
<ruleset name="php-qrcode-cs"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="vendor/squizlabs/php_codesniffer/phpcs.xsd">
	<description>php-qrcode rules for phpcs</description>

	<file>benchmark</file>
	<file>examples</file>
	<file>src</file>
	<file>tests</file>

	<config name="installed_paths" value="../../slevomat/coding-standard"/>

	<arg value="ps"/>
	<arg name="parallel" value="8"/>
	<!--<arg name="cache" value=".build/phpcs.cache"/>-->

	<arg name="basepath" value="."/>
	<arg name="extensions" value="php"/>
	<arg name="tab-width" value="4"/>

	<rule ref="Internal.Tokenizer.Exception">
		<type>error</type>
	</rule>

	<!--
		Slevomat https://github.com/slevomat/coding-standard
	-->

	<rule ref="SlevomatCodingStandard.Arrays.TrailingArrayComma"/>
	<rule ref="SlevomatCodingStandard.Arrays.DisallowImplicitArrayCreation"/>
	<rule ref="SlevomatCodingStandard.Arrays.DisallowPartiallyKeyed"/>

	<rule ref="SlevomatCodingStandard.Attributes.DisallowAttributesJoining"/>
	<rule ref="SlevomatCodingStandard.Attributes.DisallowMultipleAttributesPerLine"/>
	<rule ref="SlevomatCodingStandard.Attributes.RequireAttributeAfterDocComment"/>

	<rule ref="SlevomatCodingStandard.Classes.ClassConstantVisibility"/>
	<rule ref="SlevomatCodingStandard.Classes.DisallowConstructorPropertyPromotion"/>
	<!--<rule ref="SlevomatCodingStandard.Classes.ForbiddenPublicProperty"/>-->
	<rule ref="SlevomatCodingStandard.Classes.ModernClassNameReference"/>

	<rule ref="SlevomatCodingStandard.Commenting.DeprecatedAnnotationDeclaration"/>
	<rule ref="SlevomatCodingStandard.Commenting.EmptyComment"/>
	<rule ref="SlevomatCodingStandard.Commenting.UselessFunctionDocComment"/>
	<rule ref="SlevomatCodingStandard.Commenting.UselessInheritDocComment"/>

	<rule ref="SlevomatCodingStandard.ControlStructures.AssignmentInCondition"/>
	<rule ref="SlevomatCodingStandard.ControlStructures.DisallowContinueWithoutIntegerOperandInSwitch"/>
	<rule ref="SlevomatCodingStandard.ControlStructures.DisallowShortTernaryOperator"/>
	<rule ref="SlevomatCodingStandard.ControlStructures.DisallowTrailingMultiLineTernaryOperator"/>
	<!--<rule ref="SlevomatCodingStandard.ControlStructures.NewWithoutParentheses"/>-->
	<rule ref="SlevomatCodingStandard.ControlStructures.RequireNullCoalesceEqualOperator"/>
	<rule ref="SlevomatCodingStandard.ControlStructures.RequireNullCoalesceOperator"/>
	<rule ref="SlevomatCodingStandard.ControlStructures.RequireNullSafeObjectOperator"/>
	<rule ref="SlevomatCodingStandard.ControlStructures.DisallowYodaComparison"/>
	<rule ref="SlevomatCodingStandard.ControlStructures.UselessTernaryOperator"/>

	<rule ref="SlevomatCodingStandard.Exceptions.RequireNonCapturingCatch"/>

	<rule ref="SlevomatCodingStandard.Functions.DisallowEmptyFunction"/>
	<rule ref="SlevomatCodingStandard.Functions.RequireTrailingCommaInCall"/>
	<rule ref="SlevomatCodingStandard.Functions.RequireTrailingCommaInDeclaration"/>
	<rule ref="SlevomatCodingStandard.Functions.StrictCall"/>

	<rule ref="SlevomatCodingStandard.Namespaces.RequireOneNamespaceInFile"/>
	<rule ref="SlevomatCodingStandard.Namespaces.UseDoesNotStartWithBackslash"/>
	<rule ref="SlevomatCodingStandard.Namespaces.UselessAlias"/>
	<rule ref="SlevomatCodingStandard.Namespaces.UnusedUses"/>

	<rule ref="SlevomatCodingStandard.Numbers.DisallowNumericLiteralSeparator"/>

	<rule ref="SlevomatCodingStandard.Operators.DisallowEqualOperators"/>
	<rule ref="SlevomatCodingStandard.Operators.RequireCombinedAssignmentOperator"/>

	<rule ref="SlevomatCodingStandard.PHP.OptimizedFunctionsWithoutUnpacking"/>
	<rule ref="SlevomatCodingStandard.PHP.ShortList"/>
	<rule ref="SlevomatCodingStandard.PHP.TypeCast"/>
	<rule ref="SlevomatCodingStandard.PHP.UselessSemicolon"/>

	<rule ref="SlevomatCodingStandard.Strings.DisallowVariableParsing"/>

	<!--<rule ref="SlevomatCodingStandard.TypeHints.DisallowMixedTypeHint"/>-->
	<rule ref="SlevomatCodingStandard.TypeHints.LongTypeHints"/>
	<rule ref="SlevomatCodingStandard.TypeHints.NullTypeHintOnLastPosition"/>
	<rule ref="SlevomatCodingStandard.TypeHints.NullableTypeForNullDefaultValue"/>
	<rule ref="SlevomatCodingStandard.TypeHints.ParameterTypeHint"/>
	<rule ref="SlevomatCodingStandard.TypeHints.PropertyTypeHint"/>
	<!--<rule ref="SlevomatCodingStandard.TypeHints.ReturnTypeHint"/>-->

	<rule ref="SlevomatCodingStandard.Variables.DisallowVariableVariable"/>
	<rule ref="SlevomatCodingStandard.Variables.DuplicateAssignmentToVariable"/>
	<rule ref="SlevomatCodingStandard.Variables.UselessVariable"/>

	<rule ref="SlevomatCodingStandard.TypeHints.DeclareStrictTypes">
		<properties>
			<property name="linesCountBeforeDeclare" value="0"/>
			<property name="linesCountAfterDeclare" value="1"/>
			<property name="spacesCountAroundEqualsSign" value="0"/>
		</properties>
	</rule>

	<rule ref="SlevomatCodingStandard.Functions.RequireMultiLineCall">
		<properties>
			<property name="minLineLength" value="131"/>
		</properties>
	</rule>

	<rule ref="SlevomatCodingStandard.Variables.DisallowSuperGlobalVariable">
		<exclude-pattern>examples</exclude-pattern>
	</rule>

	<rule ref="SlevomatCodingStandard.TypeHints.DNFTypeHintFormat">
		<properties>
			<property name="shortNullable" value="no"/>
			<property name="nullPosition" value="last"/>
		</properties>
	</rule>

	<rule ref="SlevomatCodingStandard.Variables.UnusedVariable">
		<properties>
			<property name="ignoreUnusedValuesWhenOnlyKeysAreUsedInForeach" value="true"/>
		</properties>
	</rule>


	<!--
		PHPCS built-in https://tentyp.dev/library/php/phpcs/
	-->

	<rule ref="Generic.Arrays.DisallowLongArraySyntax"/>
	<rule ref="Generic.Classes.DuplicateClassName"/>
	<rule ref="Generic.CodeAnalysis.AssignmentInCondition"/>
	<rule ref="Generic.CodeAnalysis.EmptyPHPStatement"/>
	<rule ref="Generic.CodeAnalysis.ForLoopShouldBeWhileLoop"/>
	<rule ref="Generic.CodeAnalysis.ForLoopWithTestFunctionCall"/>
	<!--<rule ref="Generic.CodeAnalysis.JumbledIncrementer"/>-->
	<rule ref="Generic.CodeAnalysis.UnconditionalIfStatement"/>
	<rule ref="Generic.CodeAnalysis.UnnecessaryFinalModifier"/>
	<rule ref="Generic.CodeAnalysis.UselessOverridingMethod"/>
	<rule ref="Generic.Commenting.Fixme"/>
	<!--<rule ref="Generic.Commenting.Todo"/>-->
	<rule ref="Generic.ControlStructures.InlineControlStructure"/>
	<rule ref="Generic.Formatting.DisallowMultipleStatements"/>
	<!--<rule ref="Generic.Formatting.MultipleStatementAlignment"/>-->
	<rule ref="Generic.NamingConventions.InterfaceNameSuffix"/>
	<rule ref="Generic.NamingConventions.TraitNameSuffix"/>
	<rule ref="Generic.PHP.BacktickOperator"/>
	<rule ref="Generic.PHP.CharacterBeforePHPOpeningTag"/>
	<rule ref="Generic.PHP.DeprecatedFunctions"/>
	<rule ref="Generic.PHP.DisallowAlternativePHPTags"/>
	<rule ref="Generic.PHP.DisallowRequestSuperglobal"/>
	<rule ref="Generic.PHP.DisallowShortOpenTag"/>
	<rule ref="Generic.PHP.DiscourageGoto"/>
	<rule ref="Generic.PHP.LowerCaseConstant"/>
	<rule ref="Generic.PHP.LowerCaseKeyword"/>
	<rule ref="Generic.PHP.LowerCaseType"/>
	<rule ref="Generic.PHP.NoSilencedErrors"/>
	<rule ref="Generic.PHP.RequireStrictTypes"/>
	<rule ref="Generic.PHP.SAPIUsage"/>
	<rule ref="Generic.PHP.Syntax"/>
	<rule ref="Generic.Strings.UnnecessaryStringConcat"/>
	<!--<rule ref="Generic.WhiteSpace.DisallowSpaceIndent"/>-->
	<rule ref="Generic.WhiteSpace.IncrementDecrementSpacing"/>
	<!--<rule ref="Generic.WhiteSpace.ScopeIndent"/>-->
	<rule ref="Generic.WhiteSpace.SpreadOperatorSpacingAfter"/>

	<rule ref="PSR2.ControlStructures.ElseIfDeclaration"/>
	<rule ref="PSR2.Files.ClosingTag"/>
	<rule ref="PSR2.Files.EndFileNewline"/>
	<rule ref="PSR2.Namespaces.NamespaceDeclaration"/>

	<rule ref="PSR12.Classes.AnonClassDeclaration"/>
	<rule ref="PSR12.Classes.ClosingBrace"/>
	<rule ref="PSR12.Files.OpenTag"/>
	<rule ref="PSR12.Functions.NullableTypeDeclaration"/>


	<rule ref="Squiz.Arrays.ArrayBracketSpacing"/>
	<rule ref="Squiz.Classes.LowercaseClassKeywords"/>
	<rule ref="Squiz.Classes.SelfMemberReference"/>
	<rule ref="Squiz.Commenting.DocCommentAlignment"/>
	<rule ref="Squiz.Commenting.EmptyCatchComment"/>
	<rule ref="Squiz.Commenting.FunctionCommentThrowTag"/>
	<rule ref="Squiz.ControlStructures.ForEachLoopDeclaration"/>
	<rule ref="Squiz.ControlStructures.ForEachLoopDeclaration"/>
	<rule ref="Squiz.ControlStructures.ForLoopDeclaration"/>
	<rule ref="Squiz.ControlStructures.LowercaseDeclaration"/>
	<rule ref="Squiz.Formatting.OperatorBracket"/>
	<rule ref="Squiz.Functions.FunctionDeclaration"/>
	<rule ref="Squiz.Functions.FunctionDuplicateArgument"/>
	<rule ref="Squiz.Functions.LowercaseFunctionKeywords"/>
	<rule ref="Squiz.Operators.IncrementDecrementUsage"/>
	<rule ref="Squiz.Operators.ValidLogicalOperators"/>
	<rule ref="Squiz.PHP.DisallowMultipleAssignments"/>
	<rule ref="Squiz.PHP.DisallowSizeFunctionsInLoops"/>
	<rule ref="Squiz.PHP.Eval"/>
	<rule ref="Squiz.PHP.InnerFunctions"/>
	<rule ref="Squiz.PHP.LowercasePHPFunctions"/>
	<rule ref="Squiz.PHP.NonExecutableCode"/>
	<!--<rule ref="Squiz.Scope.MemberVarScope"/>-->
	<rule ref="Squiz.Scope.MethodScope"/>
	<rule ref="Squiz.Scope.StaticThisUsage"/>
	<rule ref="Squiz.Strings.DoubleQuoteUsage"/>
	<rule ref="Squiz.Strings.EchoedStrings"/>
	<rule ref="Squiz.WhiteSpace.CastSpacing"/>

	<rule ref="Squiz.PHP.GlobalKeyword">
		<exclude-pattern>examples</exclude-pattern>
	</rule>

	<rule ref="PSR1.Files.SideEffects">
		<exclude-pattern>examples</exclude-pattern>
		<exclude-pattern>benchmark</exclude-pattern>
	</rule>


	<!--
		Configurable built-in https://github.com/squizlabs/PHP_CodeSniffer/wiki/Customisable-Sniff-Properties
	-->

	<rule ref="Generic.ControlStructures.InlineControlStructure">
		<properties>
			<property name="error" value="true"/>
		</properties>
	</rule>

	<rule ref="Generic.Files.LineLength">
		<properties>
			<property name="lineLimit" value="140" />
			<property name="absoluteLineLimit" value="160" />
			<property name="ignoreComments" value="true" />
		</properties>
		<exclude-pattern>examples</exclude-pattern>
	</rule>

	<rule ref="Generic.Formatting.SpaceAfterCast">
		<properties>
			<property name="spacing" value="0"/>
		</properties>
	</rule>

	<rule ref="Generic.Formatting.SpaceAfterNot">
		<properties>
			<property name="spacing" value="0" />
		</properties>
	</rule>

	<rule ref="Generic.PHP.ForbiddenFunctions">
		<properties>
			<property name="forbiddenFunctions" type="array">
				<element key="die" value="exit"/>
				<element key="sizeof" value="count"/>
				<element key="delete" value="unset"/>
				<element key="print" value="echo"/>
				<element key="is_null" value="null"/>
				<element key="create_function" value="null"/>
			</property>
		</properties>
	</rule>

	<rule ref="Generic.Strings.UnnecessaryStringConcat">
		<properties>
			<property name="allowMultiline" value="true" />
		</properties>
	</rule>

	<rule ref="Generic.WhiteSpace.ArbitraryParenthesesSpacing">
		<properties>
			<property name="ignoreNewlines" value="true" />
		</properties>
	</rule>
<!--
	<rule ref="Generic.WhiteSpace.ScopeIndent">
		<properties>
			<property name="tabIndent" value="true" />
			<property name="ignoreIndentationTokens" type="array">
				<element value="T_COMMENT"/>
				<element value="T_DOC_COMMENT_OPEN_TAG"/>
			</property>
		</properties>
	</rule>
-->
	<rule ref="PSR12.ControlStructures.BooleanOperatorPlacement">
		<properties>
			<property name="allowOnly" value="first" />
		</properties>
	</rule>

	<rule ref="PSR12.Namespaces.CompoundNamespaceDepth">
		<properties>
			<property name="maxDepth" value="1" />
		</properties>
	</rule>

	<rule ref="Squiz.Strings.ConcatenationSpacing">
		<properties>
			<property name="ignoreNewlines" value="true" />
		</properties>
	</rule>

	<rule ref="Squiz.WhiteSpace.ObjectOperatorSpacing">
		<properties>
			<property name="ignoreNewlines" value="true" />
		</properties>
	</rule>
<!--
	<rule ref="Squiz.WhiteSpace.OperatorSpacing">
		<properties>
			<property name="ignoreNewlines" value="true" />
		</properties>
	</rule>
-->
	<rule ref="Squiz.WhiteSpace.SuperfluousWhitespace">
		<properties>
			<property name="ignoreBlankLines" value="true" />
		</properties>
	</rule>

</ruleset>
