// ĠCopyright Ġ 2 0 0 0 - 2 0 2 1 ĠJetBrains Ġs . r . o . Ġand Ġcontributors . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ package Ġorg . jetbrains . kotlin . idea . ins pe ctions Ċ Ċ import Ġcom . intellij . code Inspection . Local Quick Fix Ċ import Ġcom . intellij . code Inspection . Problem Descriptor Ċ import Ġcom . intellij . code Inspection . Problem Highlight Type Ċ import Ġcom . intellij . code Inspection . Problems Holder Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . psi . Psi Element Visitor Ċ import Ġorg . jetbrains . kotlin . idea . Kotlin Bundle Ċ import Ġorg . jetbrains . kotlin . idea . ins pe ctions . dfa . get Kotlin Type Ċ import Ġorg . jetbrains . kotlin . psi . Kt Constant Expression Ċ import Ġorg . jetbrains . kotlin . psi . Kt Psi Factory Ċ import Ġorg . jetbrains . kotlin . psi . expression Visitor Ċ import Ġorg . jetbrains . kotlin . psi . stubs . Constant Value Kind Ċ import Ġorg . jetbrains . kotlin . psi . stubs . elements . Kt Constant Expression ElementType Ċ import Ġorg . jetbrains . kotlin . types . type Util . is Float Ċ import Ġjava . math . BigDecimal Ċ Ċ /** Ċ Ġ* ĠHighlight Ġfloating Ġpoint Ġliterals Ġthat Ġexceed Ġprecision Ġof Ġthe Ġcorresponding Ġtype . Ċ Ġ* Ċ Ġ* ĠSome Ġfloating Ġpoint Ġvalues Ġcan 't Ġbe Ġrepresented Ġusing ĠIEEE Ġ 7 5 4 Ġfloating Ġpoint Ġstandard . Ċ Ġ* ĠFor Ġexample , Ġthe Ġliteral Ġ 9 _ 9 9 9 _ 9 9 9 _ 9 9 9 . 0 0 0 0 0 1 Ġhas Ġthe Ġsame Ġrepresentation Ġas Ġa ĠDouble Ċ Ġ* Ġas Ġthe Ġliteral Ġ 9 _ 9 9 9 _ 9 9 9 _ 9 9 9 . 0 0 0 0 0 2 . ĠSpec ifying Ġexcess Ġdigits Ġhide s Ġthe Ġfact Ġthat Ċ Ġ* Ġcomput ations Ġuse Ġthe Ġrounded Ġvalue Ġinstead Ġof Ġthe Ġexact Ġconstant . Ċ Ġ* Ċ Ġ* ĠThis Ġinspection Ġhighlight s Ġfloating Ġpoint Ġconstants Ġwhose Ġliteral Ġrepresentation Ċ Ġ* Ġrequires Ġmore Ġprecision Ġthan Ġthe Ġfloating Ġpoint Ġtype Ġcan Ġprovide . Ċ Ġ* ĠIt Ġdoes Ġnot Ġtry Ġto Ġdetect Ġrounding Ġerrors Ġor Ġotherwise Ġcheck Ġcomputation Ġresults . Ċ Ġ*/ Ċ class ĠFloating Point Literal Precision Inspection Ġ: ĠAbstract Kotlin Inspection () Ġ{ ĊĠĠĠ Ġprivate Ġval ĠFLOAT _ LITERAL Ġ= ĠK t Constant Expression ElementType . kind To Constant ElementType ( Constant Value Kind . FLOAT _ CONSTANT ) ĊĠĠĠ Ġprivate Ġval ĠFORM ATT ING _ CHAR ACT ERS _ REGEX Ġ= ĠRegex ("[ _ f F ]") ĊĊĠĠĠ Ġoverride Ġfun Ġbuild Visitor ( holder : ĠPro blems Holder , Ġis On The Fly : ĠBoolean ): ĠPsi Element Visitor Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġexpression Visitor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( it Ġis ĠK t Constant Expression ) Ġ&& Ġ( it . elementType Ġ== ĠFLOAT _ LITERAL )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Float Ġ= Ġit . get Kotlin Type ()?. is Float () Ġ?: Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuppercase Suffix Ġ= Ġis Float Ġ&& Ġit . text ?. endsWith (' F ') Ġ?: Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġliteral Ġ= Ġit . text ?. replace ( FORMAT TING _ CHAR ACT ERS _ REGEX , Ġ"") Ġ?: Ġreturn @ expression Visitor ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparse Result Ġ= Ġif Ġ( is Float ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġliteral . toFloat (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġliteral . toDouble (). toString () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrounded Value Ġ= ĠBigDecimal ( parse Result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexact Value Ġ= ĠBigDecimal ( literal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( exact Value . compareTo ( rounded Value ) Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreplacement Text Ġ= Ġif Ġ( is Float ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse Result Ġ+ Ġif Ġ( uppercase Suffix ) Ġ" F " Ġelse Ġ" f " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse Result ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . register Problem ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Bundle . message (" floating . point . literal . precision . inspection "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProblem Highlight Type . WE AK _ WARNING , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFloating Point Literal Precision Quick Fix ( replacement Text )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ expression Visitor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠFloating Point Literal Precision Quick Fix ( val Ġreplacement Text : ĠString ) Ġ: ĠLocal Quick Fix Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠgetName (): ĠString Ġ= ĠKotlin Bundle . message (" replace . with . 0 ", Ġreplacement Text ) ĊĊĠĠĠ Ġoverride Ġfun Ġget Family Name (): ĠString Ġ= Ġname ĊĊĠĠĠ Ġoverride Ġfun Ġapply Fix ( project : ĠProject , Ġdescriptor : ĠProblem Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġdescriptor . psi Element Ġas ? ĠK t Constant Expression Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġelement . replace ( Kt Psi Factory ( element ). create Expression ( replacement Text )) ĊĠĠĠ Ġ} Ċ } Ċ