/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 9 Ġ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 Ġcom . android . tools . idea . compose . preview Ċ Ċ import Ġcom . android . tools . idea . compose . preview . Compose Preview Bundle . message Ċ import Ġcom . android . tools . idea . compose . preview . util . COMP OS ABLE _ AN NOT ATION _ FQ N Ċ import Ġcom . android . tools . idea . compose . preview . util . HEIGHT _ PARAMETER Ċ import Ġcom . android . tools . idea . compose . preview . util . MAX _ HEIGHT Ċ import Ġcom . android . tools . idea . compose . preview . util . MAX _ WIDTH Ċ import Ġcom . android . tools . idea . compose . preview . util . PRE VIEW _ AN NOT ATION _ FQ N Ċ import Ġcom . android . tools . idea . compose . preview . util . PRE VIEW _ PARAMETER _ FQ N Ċ import Ġcom . android . tools . idea . compose . preview . util . WIDTH _ PARAMETER Ċ import Ġcom . android . tools . idea . compose . preview . util . isValid Preview Location Ċ import Ġcom . android . tools . idea . flags . Studio Flags Ċ import Ġcom . android . tools . idea . kotlin . find Value Argument Ċ import Ġcom . android . tools . idea . kotlin . fq Name Matches Ċ import Ġcom . android . tools . idea . util . android Facet Ċ import Ġcom . intellij . code Inspection . Local Inspection Tool Session Ċ import Ġcom . intellij . code Inspection . Problem Highlight Type Ċ import Ġcom . intellij . code Inspection . Problems Holder Ċ import Ġcom . intellij . openapi . application . Application Manager Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi Element Visitor Ċ import Ġorg . jetbrains . kotlin . idea . ins pe ctions . Abstract Kotlin Inspection Ċ import Ġorg . jetbrains . kotlin . psi . Kt Annotation Entry Ċ import Ġorg . jetbrains . kotlin . psi . Kt Import Directive Ċ import Ġorg . jetbrains . kotlin . psi . Kt Named Function Ċ import Ġorg . jetbrains . kotlin . psi . Kt Parameter Ċ import Ġorg . jetbrains . kotlin . psi . Kt Value Argument Ċ import Ġorg . jetbrains . kotlin . psi . Kt Visitor Void Ċ Ċ /** Ċ Ġ* ĠBase Ġclass Ġfor Ġinspection Ġthat Ġdepend Ġon Ġmethods Ġannotated Ġwith Ġ`@ Preview `. Ċ Ġ*/ Ċ abstract Ġclass ĠBase Preview Annotation Inspection Ġ: ĠAbstract Kotlin Inspection () Ġ{ ĊĠ Ġ/** ĠWill Ġbe Ġtrue Ġif Ġthe Ġinspect ed Ġfile Ġimports Ġthe Ġ`@ Preview ` Ġannotation . ĠThis Ġis Ġused Ġas Ġa Ġshortcut Ġto Ġavoid Ġanaly zing Ġall Ġkotlin Ġfiles Ġ*/ ĊĠ Ġvar Ġis Preview File : ĠBoolean Ġ= Ġfalse ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠCalled Ġfor Ġevery Ġfunction Ġannotated Ġwith Ġ`@ Preview ` Ġannotation . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġholder ĠA Ġ[ Problems Holder ] Ġuser Ġto Ġreport Ġproblems ĊĠĠ Ġ* Ġ@ param Ġfunction ĠThe Ġfunction Ġthat Ġwas Ġannotated Ġwith Ġ`@ Preview ` ĊĠĠ Ġ* Ġ@ param Ġpreview Annotation ĠThe Ġ`@ Preview ` Ġannotation ĊĠĠ Ġ* Ġ@ param Ġfunction Annotations ĠAll Ġthe Ġannotations Ġof Ġthe Ġmethod Ġindexed Ġby Ġthe ĠF QN , Ġincluding Ġthe Ġ`@ Preview ` Ġannotation . ĊĠĠ Ġ*/ ĊĠ Ġabstract Ġfun Ġvisit Preview Annotated Function ( holder : ĠPro blems Holder , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction : ĠK t Named Function , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreview Annotation : ĠK t Annotation Entry ) ĊĊĠ Ġfinal Ġoverride Ġfun Ġbuild Visitor ( holder : ĠPro blems Holder , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis On The Fly : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession : ĠLocal Inspection Tool Session ) Ġ= ĊĠĠĠ Ġif Ġ( Studio Flags . COMP OSE _ PRE VIEW . get () Ġ&& ĊĠĠĠĠĠĠĠ Ġ( session . file . android Facet Ġ!= Ġnull Ġ|| ĠApplication Manager . getApplication (). is UnitTest Mode )) Ġ{ ĊĠĠĠĠĠ Ġobject Ġ: ĠK t Visitor Void () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Import Directive ( import Directive : ĠK t Import Directive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġsuper . visit Import Directive ( import Directive ) ĊĊĠĠĠĠĠĠĠĠĠ Ġis Preview File Ġ= Ġis Preview File Ġ|| ĠPRE VIEW _ AN NOT ATION _ FQ N Ġ== Ġimport Directive . imported Fq Name ?. asString () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Annotation Entry ( annotation Entry : ĠK t Annotation Entry ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġsuper . visit Annotation Entry ( annotation Entry ) ĊĊĠĠĠĠĠĠĠĠĠ Ġis Preview File Ġ= Ġis Preview File Ġ|| Ġannotation Entry . fq Name Matches ( PRE VIEW _ AN NOT ATION _ FQ N ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Named Function ( function : ĠK t Named Function ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġsuper . visit Named Function ( function ) ĊĊĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Preview File ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġval Ġpreview Annotation Ġ= Ġfunction . annotation Entries . first OrNull Ġ{ Ġit . fq Name Matches ( PRE VIEW _ AN NOT ATION _ FQ N ) Ġ} Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠ Ġvisit Preview Annotated Function ( holder , Ġfunction , Ġpreview Annotation ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ ĠPsi Element Visitor . EMPTY _ VIS ITOR ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġwhether Ġthe Ġ[ Kt Parameter ] Ġcan Ġbe Ġused Ġin Ġthe Ġpreview . ĠThis Ġwill Ġreturn Ġtrue Ġif Ġthe Ġparameter Ċ Ġ* Ġhas Ġa Ġdefault Ġvalue Ġor Ġa Ġvalue Ġprovider . Ċ Ġ*/ Ċ private Ġfun ĠK t Parameter . is Accept able For Preview (): ĠBoolean Ġ= ĊĠ Ġhas DefaultValue () Ġ|| ĊĠ Ġ// ĠWhen Ġdata Ġsources Ġare Ġenabled , Ġwe Ġalso Ġaccept Ġparameters Ġwith Ġthe Ġ@ Preview Parameter Ġannotation ĊĠ Ġ( Studio Flags . COMP OSE _ PRE VIEW _ DATA _ SOURCES . get () Ġ&& Ġannotation Entries . any Ġ{ Ġit . fq Name Matches ( PRE VIEW _ PARAMETER _ FQ N ) Ġ}) Ċ Ċ /** Ċ Ġ* ĠIns pection Ġthat Ġchecks Ġthat Ġany Ġfunction Ġannotated Ġwith Ġ`@ Preview ` Ġdoes Ġnot Ġhave Ġparameters . Ċ Ġ*/ Ċ class ĠPreview Annotation In Function With Parameters Inspection Ġ: ĠBase Preview Annotation Inspection () Ġ{ ĊĠ Ġoverride Ġfun Ġvisit Preview Annotated Function ( holder : ĠPro blems Holder , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction : ĠK t Named Function , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreview Annotation : ĠK t Annotation Entry ) Ġ{ ĊĠĠĠ Ġif Ġ( function . value Parameters . any Ġ{ Ġ! it . is Accept able For Preview () Ġ}) Ġ{ ĊĠĠĠĠĠ Ġval Ġdescription Ġ= Ġif Ġ( Studio Flags . COMP OSE _ PRE VIEW _ DATA _ SOURCES . get ()) ĊĠĠĠĠĠĠĠ Ġmessage (" inspection . no . parameters . or . provider . description ") ĊĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠ Ġmessage (" inspection . no . parameters . description ") ĊĠĠĠĠĠ Ġholder . register Problem ( preview Annotation . psi Or Parent Ġas ĠPsi Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProblem Highlight Type . ERROR ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠIns pection Ġthat Ġchecks Ġthat Ġany Ġ`@ Preview ` Ġfunction Ġonly Ġhas Ġat Ġmost Ġone Ġ`@ Preview Parameter `. Ċ Ġ*/ Ċ class ĠPreview Multiple Parameter Providers Inspection Ġ: ĠBase Preview Annotation Inspection () Ġ{ ĊĠ Ġoverride Ġfun Ġvisit Preview Annotated Function ( holder : ĠPro blems Holder , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction : ĠK t Named Function , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreview Annotation : ĠK t Annotation Entry ) Ġ{ ĊĠĠĠ Ġ// ĠFind Ġthe Ġsecond ĠPreview Parameter Ġannotation Ġif Ġany ĊĠĠĠ Ġval Ġsecond Preview Parameter Ġ= Ġfunction . value Parameters . map NotNull Ġ{ ĊĠĠĠĠĠ Ġit . annotation Entries . first OrNull Ġ{ Ġannotation Ġ-> Ġannotation . fq Name Matches ( PRE VIEW _ PARAMETER _ FQ N ) Ġ} ĊĠĠĠ Ġ}. drop ( 1 ). first OrNull () Ġ?: Ġreturn ĊĊĠĠĠ Ġ// ĠFlag Ġthe Ġsecond Ġannotation Ġas Ġthe Ġerror ĊĠĠĠ Ġholder . register Problem ( second Preview Parameter Ġas ĠPsi Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage (" inspection . no . multiple . preview . provider . description "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProblem Highlight Type . ERROR ) ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠIns pection Ġthat Ġchecks Ġthat Ġany Ġfunction Ġannotated Ġwith Ġ`@ Preview ` Ġis Ġalso Ġannotated Ġwith Ġ`@ Composable `. Ċ Ġ*/ Ċ class ĠPreview Needs Composable Annotation Inspection Ġ: ĠBase Preview Annotation Inspection () Ġ{ ĊĠ Ġoverride Ġfun Ġvisit Preview Annotated Function ( holder : ĠPro blems Holder , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction : ĠK t Named Function , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreview Annotation : ĠK t Annotation Entry ) Ġ{ ĊĠĠĠ Ġval Ġnon Composable Ġ= Ġfunction . annotation Entries . none Ġ{ Ġit . fq Name Matches ( COMP OS ABLE _ AN NOT ATION _ FQ N ) Ġ} ĊĠĠĠ Ġif Ġ( non Composable ) Ġ{ ĊĠĠĠĠĠ Ġholder . register Problem ( preview Annotation . psi Or Parent Ġas ĠPsi Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage (" inspection . no . comp osable . description "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProblem Highlight Type . ERROR ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠIns pection Ġthat Ġchecks Ġthat Ġany Ġ`@ Preview ` Ġis Ġa Ġtop Ġlevel Ġmethod . Ċ Ġ* ĠThis Ġis Ġto Ġavoid Ġ`@ Preview ` Ġmethods Ġto Ġbe Ġinstance Ġmethods Ġof Ġclasses Ġthat Ġwe Ġcan Ġnot Ġinstantiate . Ċ Ġ*/ Ċ class ĠPreview Must Be TopLevel Function Ġ: ĠBase Preview Annotation Inspection () Ġ{ ĊĠ Ġoverride Ġfun Ġvisit Preview Annotated Function ( holder : ĠPro blems Holder , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction : ĠK t Named Function , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreview Annotation : ĠK t Annotation Entry ) Ġ{ ĊĠĠĠ Ġif Ġ( function . isValid Preview Location ()) Ġreturn ĊĊĠĠĠ Ġholder . register Problem ( preview Annotation . psi Or Parent Ġas ĠPsi Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage (" inspection . top . level . function "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProblem Highlight Type . ERROR ) ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠIns pection Ġthat Ġchecks Ġthat Ġ`@ Preview ` Ġwidth Ġparameter Ġdoesn 't Ġgo Ġhigher Ġthan Ġ[ MAX _ WIDTH ], Ċ Ġ* Ġand Ġthe Ġheight Ġparameter Ġdoesn 't Ġgo Ġhigher Ġthan Ġ[ MAX _ HEIGHT ]. Ċ Ġ*/ Ċ class ĠPreview Dimension Res pect s Limit Ġ: ĠBase Preview Annotation Inspection () Ġ{ ĊĠ Ġoverride Ġfun Ġvisit Preview Annotated Function ( holder : ĠPro blems Holder , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction : ĠK t Named Function , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreview Annotation : ĠK t Annotation Entry ) Ġ{ ĊĠĠĠ Ġpreview Annotation . find Value Argument ( WIDTH _ PARAMETER )?. let Ġ{ ĊĠĠĠĠĠ Ġif Ġ( it . ex ceeds Limit ( MAX _ WIDTH )) Ġ{ ĊĠĠĠĠĠĠĠ Ġholder . register Problem ( it . psi Or Parent Ġas ĠPsi Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage (" inspection . width . limit . description ", ĠMAX _ WIDTH ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProblem Highlight Type . WARNING ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpreview Annotation . find Value Argument ( HEIGHT _ PARAMETER )?. let Ġ{ ĊĠĠĠĠĠ Ġif Ġ( it . ex ceeds Limit ( MAX _ HEIGHT )) Ġ{ ĊĠĠĠĠĠĠĠ Ġholder . register Problem ( it . psi Or Parent Ġas ĠPsi Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage (" inspection . height . limit . description ", ĠMAX _ HEIGHT ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProblem Highlight Type . WARNING ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠK t Value Argument . ex ceeds Limit ( limit : ĠInt ): ĠBoolean Ġ{ ĊĠ Ġ( get Argument Expression () Ġas ? ĠPsi Element )?. node ?. text ?. toInt OrNull ()?. let Ġ{ Ġreturn Ġit Ġ> Ġlimit Ġ} ĊĠ Ġreturn Ġfalse Ċ }