@@ -3,16 +3,14 @@ package com.sschr15.aoc.compiler.internal
33import  org.jetbrains.kotlin.backend.common.extensions.IrPluginContext 
44import  org.jetbrains.kotlin.backend.common.lower.createIrBuilder 
55import  org.jetbrains.kotlin.builtins.PrimitiveType 
6+ import  org.jetbrains.kotlin.cli.common.messages.CompilerMessageLocation 
67import  org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity 
78import  org.jetbrains.kotlin.cli.jvm.compiler.report 
89import  org.jetbrains.kotlin.config.CompilerConfiguration 
910import  org.jetbrains.kotlin.ir.IrStatement 
1011import  org.jetbrains.kotlin.ir.backend.js.utils.valueArguments 
1112import  org.jetbrains.kotlin.ir.builders.irCall 
12- import  org.jetbrains.kotlin.ir.declarations.IrDeclarationBase 
13- import  org.jetbrains.kotlin.ir.declarations.IrDeclarationParent 
14- import  org.jetbrains.kotlin.ir.declarations.IrDeclarationWithName 
15- import  org.jetbrains.kotlin.ir.declarations.IrFunction 
13+ import  org.jetbrains.kotlin.ir.declarations.* 
1614import  org.jetbrains.kotlin.ir.expressions.IrCall 
1715import  org.jetbrains.kotlin.ir.expressions.IrExpression 
1816import  org.jetbrains.kotlin.ir.expressions.IrFunctionExpression 
@@ -78,6 +76,7 @@ class OverflowChecker(private val context: IrPluginContext, private val config:
7876    }
7977
8078    lateinit  var  parent:  IrDeclarationParent 
79+     lateinit  var  file:  IrFile 
8180
8281    private  fun  IrType.isSumCandidate () = 
8382        isSubtypeOfClass(context.irBuiltIns.iterableClass) ||  isArray() ||  isPrimitiveArray() ||  isSubtypeOfClass(sequenceClass)
@@ -145,6 +144,11 @@ class OverflowChecker(private val context: IrPluginContext, private val config:
145144            }
146145    }
147146
147+     override  fun  visitFile (declaration :  IrFile ): IrFile  {
148+         file =  declaration
149+         return  super .visitFile(declaration)
150+     }
151+ 
148152    override  fun  visitDeclaration (declaration :  IrDeclarationBase ): IrStatement  {
149153        if  (declaration.annotations.any { it.isAnnotationWithEqualFqName(FqName (" com.sschr15.aoc.annotations.ExportIr" 
150154            config.report(CompilerMessageSeverity .WARNING , declaration.dumpKotlinLike())
@@ -183,51 +187,72 @@ class OverflowChecker(private val context: IrPluginContext, private val config:
183187    }
184188
185189    override  fun  visitCall (expression :  IrCall ): IrExpression  {
186-         if  (! expression.type.isPrimitiveType()) return  super .visitCall(expression)
190+         try  {
191+             if  (! expression.type.isPrimitiveType()) return  super .visitCall(expression)
187192
188-         val  extension =  expression.extensionReceiver
189-         if  (extension !=  null  &&  extension.type.isSumCandidate()) {
190-             if  (expression.symbol.owner.kotlinFqName in  collectionChecks) {
191-                 return  visitSumCall(expression)
193+             val  extension =  expression.extensionReceiver
194+             if  (extension !=  null  &&  extension.type.isSumCandidate()) {
195+                 if  (expression.symbol.owner.kotlinFqName in  collectionChecks) {
196+                     return  visitSumCall(expression)
197+                 }
192198            }
193-         }
194199
195-         val  par0 =  expression.dispatchReceiver ? :  expression.valueArguments.firstOrNull() ? :  return  super .visitCall(expression)
196-         if  (par0.type.isPrimitiveType()) {
197-             val  primitiveType =  par0.type.getPrimitiveType()!! 
198-             if  (primitiveType ==  PrimitiveType .INT  &&  expression.symbol.owner.name.asString() in  intConversions) {
199-                 return  visitConversionCall(expression)
200-             } else  if  (primitiveType ==  PrimitiveType .LONG  &&  expression.symbol.owner.name.asString() in  longConversions) {
201-                 return  visitConversionCall(expression)
200+             val  par0 =  expression.dispatchReceiver ? :  expression.valueArguments.firstOrNull() ? :  return  super .visitCall(
201+                 expression
202+             )
203+             if  (par0.type.isPrimitiveType()) {
204+                 val  primitiveType =  par0.type.getPrimitiveType()!! 
205+                 if  (primitiveType ==  PrimitiveType .INT  &&  expression.symbol.owner.name.asString() in  intConversions) {
206+                     return  visitConversionCall(expression)
207+                 } else  if  (primitiveType ==  PrimitiveType .LONG  &&  expression.symbol.owner.name.asString() in  longConversions) {
208+                     return  visitConversionCall(expression)
209+                 }
202210            }
203-         }
204- 
205-         val  primitiveType =  expression.type.getPrimitiveType() ? :  return  super .visitCall(expression)
206-         if  (primitiveType !=  PrimitiveType .INT  &&  primitiveType !=  PrimitiveType .LONG ) return  super .visitCall(expression)
207-         if  (expression.symbol.owner.name.asString() !in  singleTypeChecks) return  super .visitCall(expression)
208-         if  (
209-             (expression.totalParameterCount !=  2  ||  expression.getTotalParameter(0 )!! .type !=  expression.getTotalParameter(1 )!! .type) && 
210-             (expression.totalParameterCount !=  1  ||  expression.symbol.owner.name.asString() !in  singleArgumentTypeChecks)
211-         ) {
212-             config.report(CompilerMessageSeverity .WARNING , " Unexpected number of arguments for ${expression.symbol.owner.name} , skipping" 
213-             return  super .visitCall(expression)
214-         }
215211
216-         return  context.irBuiltIns.createIrBuilder(expression.symbol, expression.startOffset, expression.endOffset)
217-             .irCall(context.referenceFunctions(CallableId (
218-                 FqName (" com.sschr15.aoc.annotations" 
219-                 null ,
220-                 expression.symbol.owner.name,
221-             )).single { it.owner.valueParameters.first().type ==  expression.type }).apply  {
222-                 expression.dispatchReceiver
223-                 val  offset =  if  (expression.dispatchReceiver !=  null ) {
224-                     putValueArgument(0 , expression.dispatchReceiver!! )
212+             val  primitiveType =  expression.type.getPrimitiveType() ? :  return  super .visitCall(expression)
213+             if  (primitiveType !=  PrimitiveType .INT  &&  primitiveType !=  PrimitiveType .LONG ) return  super .visitCall(
214+                 expression
215+             )
216+             if  (expression.symbol.owner.name.asString() !in  singleTypeChecks) return  super .visitCall(expression)
217+             if  (
218+                 (expression.totalParameterCount !=  2  ||  expression.getTotalParameter(0 )!! .type !=  expression.getTotalParameter(
225219                    1 
226-                 } else  0 
220+                 )!! .type) && 
221+                 (expression.totalParameterCount !=  1  ||  expression.symbol.owner.name.asString() !in  singleArgumentTypeChecks)
222+             ) {
223+                 config.report(
224+                     CompilerMessageSeverity .WARNING ,
225+                     " Unexpected number of arguments for ${expression.symbol.owner.name} , skipping" 
226+                 )
227+                 return  super .visitCall(expression)
228+             }
227229
228-                 for  (i in  0  until expression.valueArgumentsCount) {
229-                     putValueArgument(i +  offset, expression.getValueArgument(i))
230+             return  context.irBuiltIns.createIrBuilder(expression.symbol, expression.startOffset, expression.endOffset)
231+                 .irCall(
232+                     context.referenceFunctions(
233+                         CallableId (
234+                             FqName (" com.sschr15.aoc.annotations" 
235+                             null ,
236+                             expression.symbol.owner.name,
237+                         )
238+                     ).single { it.owner.valueParameters.first().type ==  expression.type }).apply  {
239+                     expression.dispatchReceiver
240+                     val  offset =  if  (expression.dispatchReceiver !=  null ) {
241+                         putValueArgument(0 , expression.dispatchReceiver!! )
242+                         1 
243+                     } else  0 
244+ 
245+                     for  (i in  0  until expression.valueArgumentsCount) {
246+                         putValueArgument(i +  offset, expression.getValueArgument(i))
247+                     }
230248                }
231-             }
249+         } catch  (e:  Exception ) {
250+             config.report(
251+                 CompilerMessageSeverity .ERROR ,
252+                 " Error while checking for overflow: ${e.stackTraceToString()} " 
253+                 CompilerMessageLocation .create(file.path, file.fileEntry.getLineNumber(expression.startOffset), file.fileEntry.getColumnNumber(expression.startOffset), null )
254+             )
255+             return  expression
256+         }
232257    }
233258}
0 commit comments