mirror of
https://github.com/FabricMC/fabric.git
synced 2024-11-27 10:05:35 -05:00
f995ab4233
# Fabric API Lookup API v1
## Introduction
This module allows Api instances to be associated with game objects without specifying how the association is implemented. This is useful when the same Api could be implemented more than once or implemented in different ways.
Many thanks to @Grondag for providing the original concept (#1072).
Thanks also go to @i509VCB, @Pyrofab, @sfPlayer1 and the others who were involved with the design of this module.
This is the foundation upon which can be built for example a fluid transfer api (#1166). Closes #1199.
## Flexible Api Querying
## Block Api Usage example
## Building blocks
This PR was changed a lot, please have a look at the README, the package info, and the javadoc for `BlockApiLookup` and `ApiLookupMap` for up-to-date documentation.
## More usage examples
FastTransferLib (https://github.com/Technici4n/FastTransferLib) is an experiment to build an item, fluid and energy transfer api on top of this module. (Which was until recently called `fabric-provider-api-v1`.)
## Missing things?
~~I could add an overload of `BlockApiLookup#find` with nullable `BlockState` and `BlockEntity` parameters, so that the caller can directly provide them if they are available for some reason.~~ Added in later commits.
There is no module to retrieve apis from items or entities yet because there were unsolved issues with those. The community can use the provided building blocks to experiment with their own implementations of `ItemStackApiLookup` and `EntityApiLookup` until the way forward becomes clear, but let's please not delay the `BlockApiLookup` because of that.
Co-authored-by: i509VCB <git@i509.me>
Co-authored-by: PepperBell <44146161+PepperCode1@users.noreply.github.com>
(cherry picked from commit dc716ea167
)
207 lines
9.7 KiB
XML
207 lines
9.7 KiB
XML
<?xml version="1.0"?>
|
|
<!DOCTYPE module PUBLIC "-//Puppy Crawl//DTD Check Configuration 1.2//EN" "http://www.puppycrawl.com/dtds/configuration_1_2.dtd">
|
|
<module name="Checker">
|
|
<property name="charset" value="UTF-8"/>
|
|
<property name="fileExtensions" value="java"/>
|
|
<property name="localeLanguage" value="en"/>
|
|
<property name="localeCountry" value="US"/>
|
|
<property name="tabWidth" value="4"/>
|
|
|
|
<module name="NewlineAtEndOfFile"/>
|
|
|
|
<!-- disallow trailing whitespace -->
|
|
<module name="RegexpSingleline">
|
|
<property name="format" value="\s+$"/>
|
|
<property name="message" value="trailing whitespace"/>
|
|
</module>
|
|
|
|
<!-- note: RegexpMultiline shows nicer messages than Regexp, but has to be outside TreeWalker -->
|
|
<!-- disallow multiple consecutive blank lines -->
|
|
<module name="RegexpMultiline">
|
|
<property name="format" value="\n[\t ]*\r?\n[\t ]*\r?\n"/>
|
|
<property name="message" value="adjacent blank lines"/>
|
|
</module>
|
|
|
|
<!-- disallow blank after { -->
|
|
<module name="RegexpMultiline">
|
|
<property name="format" value="\{[\t ]*\r?\n[\t ]*\r?\n"/>
|
|
<property name="message" value="blank line after '{'"/>
|
|
</module>
|
|
|
|
<!-- disallow blank before } -->
|
|
<module name="RegexpMultiline">
|
|
<property name="format" value="\n[\t ]*\r?\n[\t ]*\}"/>
|
|
<property name="message" value="blank line before '}'"/>
|
|
</module>
|
|
|
|
<!-- require blank before { in the same indentation level -->
|
|
<module name="RegexpMultiline">
|
|
<!-- the regex works as follows:
|
|
It matches (=fails) for \n<indentation><something>\n<same indentation><control statement>[...]{\n
|
|
while <something> is a single line comment, it'll look for a blank line one line earlier
|
|
if <something> is a space, indicating a formatting error or ' */', it'll ignore the instance
|
|
if <something> is a tab, indicating a continued line, it'll ignore the instance
|
|
<control statement> is 'if', 'do', 'while', 'for', 'try' or nothing (instance initializer block)
|
|
|
|
- first \n: with positive lookbehind (?<=\n) to move the error marker to a more reasonable place
|
|
- capture tabs for <indentation>, later referenced via \1
|
|
- remaining preceding line as a non-comment (doesn't start with '/', '//', ' ' or '\t') or multiple lines where all but the first are a single line comment with the same indentation
|
|
- new line
|
|
- <indentation> as captured earlier
|
|
- <control statement> as specified above
|
|
- { before the next new line -->
|
|
<property name="format" value="(?<=\n)([\t]+)(?:[^/\r\n \t][^\r\n]*|/[^/\r\n][^\r\n]*|[^/\r\n][^\r\n]*(\r?\n\1//[^\r\n]*)+)\r?\n\1(|(if|do|while|for|try)[^\r\n]+)\{[\t ]*\r?\n"/>
|
|
<property name="message" value="missing blank line before block at same indentation level"/>
|
|
</module>
|
|
|
|
<!-- require blank after } in the same indentation level -->
|
|
<module name="RegexpMultiline">
|
|
<!-- \n<indentation>}\n<same indentation><whatever unless newline, '}' or starting with cas(e) or def(ault)> -->
|
|
<property name="format" value="(?<=\n)([\t]+)\}\r?\n\1(?:[^\r\n\}cd]|c[^\r\na]|ca[^\r\ns]|d[^\r\ne]|de[^\r\nf])"/>
|
|
<property name="message" value="missing blank line after block at same indentation level"/>
|
|
</module>
|
|
|
|
<module name="TreeWalker">
|
|
<!-- Allow "//CHECKSTYLE.OFF: <InspectionName>" and "//CHECKSTYLE.ON: <InspectionName>" pairs to toggle some inspections -->
|
|
<module name="SuppressionCommentFilter">
|
|
<property name="offCommentFormat" value="CHECKSTYLE.OFF\: ([\w\|]+)"/>
|
|
<property name="onCommentFormat" value="CHECKSTYLE.ON\: ([\w\|]+)"/>
|
|
<property name="checkFormat" value="$1"/>
|
|
</module>
|
|
|
|
<!-- Ensure all imports are ship shape -->
|
|
<module name="AvoidStarImport"/>
|
|
<module name="IllegalImport"/>
|
|
<module name="RedundantImport"/>
|
|
<module name="UnusedImports"/>
|
|
|
|
<module name="ImportOrder">
|
|
<property name="groups" value="java,javax,*,net.minecraft,net.fabricmc"/>
|
|
<property name="ordered" value="false"/><!-- the plugin orders alphabetically without considering separators.. -->
|
|
<property name="separated" value="true"/>
|
|
<property name="option" value="top"/>
|
|
<property name="sortStaticImportsAlphabetically" value="true"/>
|
|
</module>
|
|
|
|
<!-- Ensures braces are at the end of a line -->
|
|
<module name="LeftCurly"/>
|
|
<module name="RightCurly"/>
|
|
|
|
<!-- single line statements on one line, -->
|
|
<module name="NeedBraces">
|
|
<property name="tokens" value="LITERAL_IF,LITERAL_FOR,LITERAL_WHILE"/>
|
|
<property name="allowSingleLineStatement" value="true"/>
|
|
</module>
|
|
<module name="NeedBraces">
|
|
<property name="tokens" value="LITERAL_ELSE,LITERAL_DO"/>
|
|
<property name="allowSingleLineStatement" value="false"/>
|
|
</module>
|
|
|
|
<module name="EmptyLineSeparator">
|
|
<property name="allowNoEmptyLineBetweenFields" value="true"/>
|
|
<property name="allowMultipleEmptyLines" value="false"/>
|
|
<!-- exclude METHOD_DEF and VARIABLE_DEF -->
|
|
<property name="tokens" value="PACKAGE_DEF,IMPORT,STATIC_IMPORT,CLASS_DEF,INTERFACE_DEF,ENUM_DEF,STATIC_INIT,INSTANCE_INIT,CTOR_DEF"/>
|
|
</module>
|
|
|
|
<module name="OperatorWrap"/>
|
|
<module name="SeparatorWrap">
|
|
<property name="tokens" value="DOT,ELLIPSIS,AT"/>
|
|
<property name="option" value="nl"/>
|
|
</module>
|
|
<module name="SeparatorWrap">
|
|
<property name="tokens" value="COMMA,SEMI"/>
|
|
<property name="option" value="eol"/>
|
|
</module>
|
|
|
|
<module name="Indentation">
|
|
<property name="basicOffset" value="4"/>
|
|
<property name="caseIndent" value="0"/>
|
|
<property name="throwsIndent" value="4"/>
|
|
<property name="arrayInitIndent" value="4"/>
|
|
<property name="lineWrappingIndentation" value="8"/>
|
|
</module>
|
|
|
|
<module name="ParenPad"/>
|
|
<module name="NoWhitespaceBefore"/>
|
|
<module name="NoWhitespaceAfter">
|
|
<!-- allow ARRAY_INIT -->
|
|
<property name="tokens" value="AT,INC,DEC,UNARY_MINUS,UNARY_PLUS,BNOT,LNOT,DOT,ARRAY_DECLARATOR,INDEX_OP"/>
|
|
</module>
|
|
<module name="WhitespaceAfter"/>
|
|
<module name="WhitespaceAround">
|
|
<!-- Allow PLUS, MINUS, MUL, DIV as they may be more readable without spaces in some cases -->
|
|
<property name="tokens" value="ASSIGN,BAND,BAND_ASSIGN,BOR,BOR_ASSIGN,BSR,BSR_ASSIGN,BXOR,BXOR_ASSIGN,COLON,DIV_ASSIGN,DO_WHILE,EQUAL,GE,GT,LAMBDA,LAND,LCURLY,LE,LITERAL_CATCH,LITERAL_DO,LITERAL_ELSE,LITERAL_FINALLY,LITERAL_FOR,LITERAL_IF,LITERAL_RETURN,LITERAL_SWITCH,LITERAL_SYNCHRONIZED,LITERAL_TRY,LITERAL_WHILE,LOR,LT,MINUS_ASSIGN,MOD,MOD_ASSIGN,NOT_EQUAL,PLUS_ASSIGN,QUESTION,RCURLY,SL,SLIST,SL_ASSIGN,SR,SR_ASSIGN,STAR,STAR_ASSIGN,LITERAL_ASSERT,TYPE_EXTENSION_AND"/>
|
|
</module>
|
|
<module name="SingleSpaceSeparator"/>
|
|
<module name="GenericWhitespace"/>
|
|
<module name="CommentsIndentation"/>
|
|
|
|
<module name="ArrayTypeStyle"/>
|
|
<module name="DefaultComesLast">
|
|
<property name="skipIfLastAndSharedWithCase" value="true"/>
|
|
</module>
|
|
<module name="SimplifyBooleanExpression"/>
|
|
<module name="SimplifyBooleanReturn"/>
|
|
<module name="StringLiteralEquality"/>
|
|
|
|
<module name="ModifierOrder"/>
|
|
<module name="RedundantModifier"/>
|
|
|
|
<module name="AnnotationLocation"/>
|
|
<module name="MissingOverride"/>
|
|
|
|
<!-- By default this allows catch blocks with only comments -->
|
|
<module name="EmptyCatchBlock"/>
|
|
|
|
<!-- Enforce tabs -->
|
|
<module name="RegexpSinglelineJava">
|
|
<property name="format" value="^\t* ([^*]|\*[^ /])"/>
|
|
<property name="message" value="non-tab indentation"/>
|
|
</module>
|
|
|
|
<module name="OuterTypeFilename"/>
|
|
<module name="PackageDeclaration"/>
|
|
<module name="PackageName">
|
|
<!-- require a package following the following structure:
|
|
base package name: net.fabricmc.fabric
|
|
+ api/implementation/mixin subpackage: api/impl/mixin
|
|
+ client/dedicated server/common env subpackage: client/server/<nothing>
|
|
+ module name subpackage, singular, may contain multiple .-separated parts
|
|
+ api only: module major version with v prefix (e.g. v1)
|
|
+ other subpackages as needed, all singular
|
|
|
|
The regex works as follows:
|
|
It matches (=succeeds) for one of these cases:
|
|
- net.fabricmc.fabric.api.client.<module-name>.v<version>[.<extra packages...>]
|
|
- net.fabricmc.fabric.api.server.<module-name>.v<version>[.<extra packages...>]
|
|
- net.fabricmc.fabric.api.<module-name>.v<version>[.<extra packages...>]
|
|
- net.fabricmc.fabric.(impl|mixin).client.<module-name>[.<extra packages...>]
|
|
- net.fabricmc.fabric.(impl|mixin).server.<module-name>[.<extra packages...>]
|
|
- net.fabricmc.fabric.(impl|mixin).<module-name>[.<extra packages...>]
|
|
- <any legacy package>
|
|
where <module-name> is a set of '.'-separated words, all in singular (not ending with s except for ss) and not starting with client. or server.
|
|
and <version> is a positive integer (1, 2, 3, ...)
|
|
and <extra packages...> is a set of '.'-separated words with all the first potentially containing digits.
|
|
Negative lookahead ensures that client/server can't be replaced with common disguised as the module name.
|
|
|
|
The regex is implemented in 3 parts:
|
|
- the net.fabricmc.fabric. prefix
|
|
- patterns for
|
|
- api packages: api + <not common> + client/server/nothing + <module-name> + 'v' + <version>
|
|
- impl+mixin packages : impl/mixin + <not common> + client/server/nothing + <module-name>
|
|
- literal legacy packages (exceptions)
|
|
- largely unconstained trailing subpackages
|
|
-->
|
|
<property name="format"
|
|
value="^net\.fabricmc\.fabric\.(api(?!\.common\.)(\.client|\.server|)(\.(?!client\.|server\.)[a-z]+([a-rt-z]|ss))+\.v[1-9][0-9]*|(impl|mixin|test)(?!\.common\.)(\.client|\.server|)(\.(?!client\.|server\.)[a-z]+[a-rt-z])+|api\.(event|util|biomes\.v1|registry|client\.screen|container|block|entity|client\.itemgroup|client\.keybinding|tag|tools|client\.model|network|server|client\.render|resource|client\.texture))(|\.[a-z]+(\.[a-z0-9]+)*)$"/>
|
|
</module>
|
|
|
|
<!--<module name="InvalidJavadocPosition"/>-->
|
|
<module name="JavadocParagraph"/>
|
|
<module name="JavadocStyle"/>
|
|
<module name="AtclauseOrder">
|
|
<property name="tagOrder" value="@param,@return,@throws,@deprecated"/>
|
|
</module>
|
|
</module>
|
|
</module>
|