/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġandroidx . build . lint Ċ Ċ import Ġcom . android . tools . lint . detector . api . Annotation Usage Type Ċ import Ġcom . android . tools . lint . detector . api . Category Ċ import Ġcom . android . tools . lint . detector . api . Detector Ċ import Ġcom . android . tools . lint . detector . api . Implementation Ċ import Ġcom . android . tools . lint . detector . api . Issue Ċ import Ġcom . android . tools . lint . detector . api . Java Context Ċ import Ġcom . android . tools . lint . detector . api . Scope Ċ import Ġcom . android . tools . lint . detector . api . Severity Ċ import Ġcom . android . tools . lint . detector . api . Source Code Scanner Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi Method Ċ import Ġorg . jetbrains . u ast . U Annotation Ċ import Ġorg . jetbrains . u ast . U Element Ċ import Ġorg . jetbrains . u ast . get Containing U Class Ċ Ċ class ĠB an In appro priate Experimental Usage Ġ: ĠDetector (), ĠSource Code Scanner Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġapplicable Annotations (): ĠList < String >? Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠ ĠJAVA _ EXPERIMENT AL _ AN NOT ATION , ĊĠĠĠĠĠĠĠ ĠK OT LIN _ OPT _ IN _ AN NOT ATION , ĊĠĠĠĠĠĠĠ ĠK OT LIN _ EXPERIMENT AL _ AN NOT ATION ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Annotation Usage ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠJava Context , ĊĠĠĠĠĠĠĠ Ġusage : ĠU Element , ĊĠĠĠĠĠĠĠ Ġtype : ĠAnnotation Usage Type , ĊĠĠĠĠĠĠĠ Ġannotation : ĠU Annotation , ĊĠĠĠĠĠĠĠ Ġqualified Name : ĠString , ĊĠĠĠĠĠĠĠ Ġmethod : ĠPsi Method ?, ĊĠĠĠĠĠĠĠ Ġreferenced : ĠPsi Element ?, ĊĠĠĠĠĠĠĠ Ġannotations : ĠList < U Annotation >, ĊĠĠĠĠĠĠĠ Ġall Member Annotations : ĠList < U Annotation >, ĊĠĠĠĠĠĠĠ Ġall Class Annotations : ĠList < U Annotation >, ĊĠĠĠĠĠĠĠ Ġall Package Annotations : ĠList < U Annotation > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( qualified Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJAVA _ EXPERIMENT AL _ AN NOT ATION , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJAVA _ OPT _ IN _ AN NOT ATION , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠK OT LIN _ EXPERIMENT AL _ AN NOT ATION , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠK OT LIN _ OPT _ IN _ AN NOT ATION Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify Experimental Or Opt In Usage Is Within Same Group ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , Ġusage , Ġannotation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġverify Experimental Or Opt In Usage Is Within Same Group ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠJava Context , ĊĠĠĠĠĠĠĠ Ġusage : ĠU Element , ĊĠĠĠĠĠĠĠ Ġannotation : ĠU Annotation ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdeclaring Group Ġ= Ġget Approx imate Annotation Maven Group ( annotation ) ĊĠĠĠĠĠĠĠ Ġval Ġusing Group Ġ= Ġget Approx imate Usage Site Maven Group ( usage ) ĊĠĠĠĠĠĠĠ Ġ// ĠDon 't Ġflag Ġif Ġgroup Ġis Ġnull Ġfor Ġsome Ġreason Ġ( for Ġnow Ġat Ġleast ) ĊĠĠĠĠĠĠĠ Ġ// ĠAlso Ġexclude Ġsample Ġfor Ġnow , Ġsince Ġit Ġdoesn 't Ġwork Ġwell Ġwith Ġour Ġworkaround Ġ( includes ĊĠĠĠĠĠĠĠ Ġ// Ġclass ) ĊĠĠĠĠĠĠĠ Ġif Ġ( decl aring Group Ġ!= Ġnull Ġ&& Ġusing Group Ġ!= Ġnull Ġ&& Ġdeclaring Group Ġ!= Ġusing Group Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġusing Group Ġ!= Ġ" sample " ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . report ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB an In appro priate Experimental Usage . ISSUE , Ġusage , Ġcontext . getName Location ( usage ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Experimental / Opt In ĠAPIs Ġshould Ġonly Ġbe Ġused Ġfrom Ġwithin Ġthe Ġsame Ġlibrary Ġor Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" libraries Ġwithin Ġthe Ġsame Ġrequire Same Version Ġgroup " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Approx imate Annotation Maven Group ( annotation : ĠU Annotation ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( annotation . get Containing U Class () Ġ== Ġnull Ġ|| Ġannotation . get Containing U Class () !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. qualified Name Ġ== Ġnull ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġannotation . get Containing U Class () !!. qualified Name !!. split (". "). sub List ( 0 , Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString (".") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Approx imate Usage Site Maven Group ( usage : ĠU Element ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( usage . get Containing U Class () Ġ== Ġnull Ġ|| Ġusage . get Containing U Class () !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. qualified Name Ġ== Ġnull ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġusage . get Containing U Class () !!. qualified Name !!. split (". "). sub List ( 0 , Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString (".") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠK OT LIN _ EXPERIMENT AL _ AN NOT ATION Ġ= Ġ" kotlin . Experimental " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠJAVA _ EXPERIMENT AL _ AN NOT ATION Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" android x . annotation . experimental . Experimental " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠK OT LIN _ OPT _ IN _ AN NOT ATION Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" kotlin . Opt In " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠJAVA _ OPT _ IN _ AN NOT ATION Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" android x . annotation . Opt In " ĊĊĠĠĠĠĠĠĠ Ġval ĠISS UE Ġ= ĠIssue . create ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Illegal Experimental Api Usage ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Experimental Ġap is Ġcan Ġonly Ġbe Ġused Ġfrom Ġwithin Ġthe Ġsame Ġlibrary Ġor Ġfrom Ġlibraries Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" that Ġare Ġpart Ġof Ġthe Ġsame Ġrequire Same Version Ġmaven Ġgroup .", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"@ Requires Opt In Ġand Ġ@ Experimental ĠAPIs Ġare Ġconsidered Ġalpha , Ġand Ġwe Ġdo Ġnot Ġallow Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" non - atomic Ġinter - library Ġusage Ġof Ġalpha ĠAPIs .", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCategory . CORRECT NESS , Ġ 5 , ĠSeverity . ERROR , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠImplementation ( Ban In appro priate Experimental Usage :: class . java , ĠScope . JAVA _ FILE _ SCOPE ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ }