Я пытаюсь написать пользовательское правило Lint для библиотеки SDK, которую я написал. Я использую шаблон построителя в библиотеке, чего я хочу добиться с помощью правила Lint, так это проверить, вызывал ли пользователь определенный метод перед вызовом build().
Вот что я смог сделать до сих пор -
Исходный/java-файл для библиотеки с шаблоном Builder:
public class ShowCaseAPI {
private String regionCode = "";
private String subRegionCode = "";
private String latitude = "";
private String longitude = "";
private String REGION_CODE_KEY = "rc";
private String SUB_REGION_CODE_KEY = "sc";
private String CHANNEL_KEY = "ch";
private String LATITUDE_KEY = "lt";
private String LONGITUDE_KEY = "lg";
private String COMMAND_KEY = "cmd";
private String COMMAND_TYPE = "GETSHOWCASE";
private String CHANNEL_TYPE = "mobile";
private String showCaseUrl = Urls.GET_SHOWCASE_URL;
public ShowCaseAPI setRegionCode(String regionCode) {
this.regionCode = regionCode;
return this;
}
public ShowCaseAPI setSubRegionCode(String subRegionCode) {
this.subRegionCode = subRegionCode;
return this;
}
public ShowCaseAPI setLatitude(String latitude) {
this.latitude = latitude;
return this;
}
public ShowCaseAPI setLongitude(String longitude) {
this.longitude = longitude;
return this;
}
public ShowCaseAPI overrideBaseURL(String newUrl) {
this.showCaseUrl = newUrl;
return this;
}
public String buildAPIParameters() {
Uri builtUri = Uri.parse(showCaseUrl)
.buildUpon()
.appendQueryParameter(COMMAND_KEY, COMMAND_TYPE)
.appendQueryParameter(REGION_CODE_KEY, this.regionCode)
.appendQueryParameter(SUB_REGION_CODE_KEY, this.subRegionCode)
.appendQueryParameter(LATITUDE_KEY, this.latitude)
.appendQueryParameter(LONGITUDE_KEY, this.longitude)
.appendQueryParameter(CHANNEL_KEY, CHANNEL_TYPE)
.build();
String showCaseUrl = builtUri.toString();
return showCaseUrl;
}
Код Lint, который я смог придумать до сих пор:
@Override
public AstVisitor createJavaVisitor(@NonNull final JavaContext context) {
return new ForwardingAstVisitor() {
@Override
public boolean visitMethodInvocation(MethodInvocation node) {
String methodName = node.astName().astValue();
if (methodName.equals("buildAPIParameters")){
//Here is where I need to check if other methods have been invoked before calling this
}
return super.visitMethodInvocation(node);
}
};
}
Я попытался просмотреть lint_rules в исходном коде, но не смог найти что-то подобное. Любые идеи или указатели относительно того, как это сделать, были бы действительно полезны.