Commit Graph

1602 Commits

Author SHA1 Message Date
Vladimir Sukharev 3cdf4bae07 [K2/N] Refactor KonanSymbols before re-enabling special backend checks
^KT-55598
Merge-request: KT-MR-9477
Merged-by: Vladimir Sukharev <Vladimir.Sukharev@jetbrains.com>
2023-04-17 10:35:55 +00:00
Pavel Kunyavskiy 95541da9a1 [K/N] Remove unused default dependencies from klib
^KT-55603
2023-04-13 18:28:51 +00:00
mcpiroman 7a189dc0ac [IR] Make IrMemberAccessExpression.origin mutable
Align it with all other element types where origin is mutable.
This was left unchanged previously probably because the
IrMemberAccessExpression was not handled by the tree generator.
2023-04-12 19:50:23 +02:00
mcpiroman 9831a4b9ec [IR] Autogenerate IrMemberAccessExpression 2023-04-12 19:50:23 +02:00
mcpiroman 9145cf7035 IR tree gen: allow lists of nullable elements and arrays 2023-04-12 19:50:23 +02:00
mcpiroman 62c72dedcf [IR] Prepare IrMemberAccessExpression for being autogenerated 2023-04-12 19:50:23 +02:00
Alexander Udalov 9fa5bd386c IR: minor, move IrMemberAccessExpression utils to a separate file
To help git understand that IrMemberAccessExpression is moved in the
subsequent commits where it's changed to be auto-generated.
2023-04-12 19:50:23 +02:00
Alexander Udalov 35776ed4fa IR: remove obsolete descriptor-based utils for IrMemberAccessExpression
Except `putTypeArguments`, which is moved to psi2ir where it's used.
2023-04-12 19:50:23 +02:00
Alexander Udalov 36183c411a IR: rename IrMemberAccessExpression.type/valueArguments 2023-04-12 19:50:23 +02:00
Sergej Jaskiewicz 3713d95bb1 [klib] Don't deserialize the list of sealed subclasses from klibs
tl;dr the current design of klibs does not allow to properly deserialize
the list of sealed subclasses in a sound way. It is possible that
a subclass of a sealed class is declared in a different file, AND is
private in that file.

A more detailed explanation:

Right now we don't serialize file signatures at all.
However, a private declaration's signature must necessarily include
the file signature.

How do we serialize a private declaration's signature into a klib
and deserialize it later?

**Serialization** is simple: we just serialize the file signature as
an empty protobuf message.

When we are **deserializing** a private declaration, we look at the file
that is being deserialized right now, and construct the file signature
based on that.

This logic, however, doesn't always work. An example is KT-54028.

Basically, if we have a sealed interface with a private implementor
declared in a different file, this breaks:

1. We are deserializing the sealed interface. The deserializer knows
that we are now in the file in which the sealed interface is declared.
2. As part of deserializing the interface, we deserialize its sealed
subclasses.
3. Naturally, we come to deserializing the private implementor that is
declared in another file, but the deserializer still thinks that we are
in the file in which the interface is declared. A wrong signature is
created, which leads to linkage failure.

We *could* fix this by properly serializing the file signature,
i.e. instead of an empty protobuf message we could write the file path
and its package to the klib. However, there a problems with this
approach:

- The current design of signatures allows a situation where two
different files can have the same relative path
(for example, with the help of the `-Xklib-relative-path-base` compiler
flag) *and* the same package, which would introduce ambiguity during
linkage.
- Most importantly, this appoach won't work well with incremental
compilation of klibs. Currently we rely on the assumption that all
cross-file references are handled with public signatures, and private
signatures are only used inside a single file. This allows to move
declarations across files without recompiling it's use sites.

It has been decided to apply the following hacky solution: we just don't
deserialize the list of sealed subclasses from klibs.
The list of sealed subclasses is not used in lowerings, so it should be
safe.

#KT-54028 Fixed
2023-04-05 15:51:54 +00:00
Dmitriy Dolovov b7d0209e4b [PL] Disallow partial linkage when compiler is configured to produce KLIB
Partial linkage is intended for producing binaries, not libraries.
2023-03-31 18:29:44 +00:00
Dmitriy Dolovov 1fef48bb60 [PL] Log partial linkage messages at different severity
As specified in -Xpartial-linkage-loglevel CLI argument.
2023-03-31 18:29:44 +00:00
Dmitriy Dolovov 46ed6e5766 [PL] Change semantics of CLI parameter -Xpartial-linkage
This parameter accepts the name of the "mode" in which the partial linkage would work. Currently, only two options are supported: 'enable', 'disable'. But the list may be extended in the future as needed.

At the moment the 'disable' option is the default one. This will be changed in #KT-51447, #KT-51443.
2023-03-30 12:38:07 +00:00
Dmitriy Dolovov a450866db3 [PL] Commonize Native & JS compiler configuration keys 2023-03-30 12:38:07 +00:00
Dmitriy Novozhilov c957a0b43b [IR] Properly serialize IrDeclarationOrigin.GeneratedByPlugin to klibs
^KT-56911 Fixed
2023-03-30 07:52:56 +00:00
Dmitriy Dolovov 0a38b29491 [PL] Drop useless KotlinIrLinkerInternalException
It only added a confusion, while in fact has no practical sense.
2023-03-28 08:50:59 +00:00
Artem Kobzar 6b62499c85 [K/JS] Add previousOffset to InteropCallableReferenceLowering + include SYNTHETIC_OFFSET branch into previousOffset calculation 2023-03-27 21:45:00 +00:00
Dmitriy Dolovov 6fe0849402 [IR] Unify usages of isArrayOrPrimitiveArray() && isInlineArrayConstructor() 2023-03-24 19:12:17 +01:00
Dmitriy Dolovov 66532d714e [PL] Fix: Respect inlined array constructor lambdas 2023-03-24 18:09:37 +00:00
Dmitriy Dolovov 2a4d880037 [PL] Deep rework of the partial linkage
1. Leaving no unbound symbols in the IR tree, KT-54491:
   - All unbound symbols are bound to synthetic stub declarations
   - Improved detection of the root cause for every partially linked classifier
   - Improved error messages

2. Visibility valiation, KT-54469

3. Always check deserialized symbols:
   If the deserialized symbol mismatches the symbol kind at the call site in the deserializer then generate and reference another symbol with the same signature. In case PL is off, just throw IrSymbolTypeMismatchException.

4. Handle class inheritance violation:
   - Detect illegal inheritance (ex: inheriting from a final class)
   - Detect invalid constructor delegation (ex: delegating to another class than the direct superclass)
   - Simplification: Reduce the number of PartialLinkageCase subclasses
   - Reworked error message generation to have shorter and clearer messages

5. Handle class transformations and all known side-effects, examples:
   - nested <-> inner
   - class <-> enum/object
   - adding/removing subclasses of sealed class
   - adding/removing enum entries

6. Check direct instantiation of abstract class.
   Such instantiation could be possible if a class was non-abstract in the previous version of a library.

7. Handle unlinked annotations on declarations.
   Such annotations are removed from the IR. The appropriate compiler error message is produced for every individual case.

8. Handle value argument count mismatch at call sites

9. Handle calling suspend function from non-suspend context.
   This could happen if a suspen function was non-suspend in the previous version of a library.

10. Handle overriding inline callables.
    Only the leaf final callable can be marked with `inline`.

11. Detect illegal non-local returns from noinline/crossinline lambdas.
2023-03-23 10:24:27 +00:00
Dmitriy Dolovov 974ee3139c [PL] Track all unbound symbols produced by the partial linkage.
With the partial linkage turned on it's hard to predict whether a newly created IrSymbol that is added to the SymbolTable via one of referenceXXX() calls will or won't be bound to some declaration. The latter may happen in certain cases, for example when the symbol refers from an IR expression to a non-top level declaration that was removed in newer version of Kotlin library (KLIB). Unless such symbol is registered as "probably unbound" it remains invisible for the linkage process.

The optimization that allows to reference symbols without registering them as "probably unbound" is fragile. It's better to avoid calling any referenceXXX(reg = false) functions. Instead, wherever it is s suitable it is recommended to use one of the appropriate declareXXX() calls.

For the future: Consider implementing the optimization once again for the new "flat" ID signatures.

Also: Temporarily mute assertion that checks symbols overwrites in SymbolTable ^KT-57049
2023-03-23 10:24:26 +00:00
Dmitriy Dolovov c38d0d7359 [IR] Refactoring: Clean-up in ExternalDependenciesGenerator
Note: There is no need to catch KotlinIrLinkerInternalException and
re-throw it as CompilationErrorException since the fix of KT-53649.
2023-03-23 10:24:25 +00:00
Dmitriy Dolovov eec511a767 [PL] Fix line/column numbers in error messages 2023-03-23 10:24:25 +00:00
Nikolay Lunyak 505edb9746 [FIR2IR] KT-57211: Support unsigned arrayOf-s in fir2ir
^KT-57211 Fixed

Merge-request: KT-MR-9294
Merged-by: Nikolay Lunyak <Nikolay.Lunyak@jetbrains.com>
2023-03-22 13:10:17 +00:00
Vyacheslav Gerasimov 76c54a8ff3 Build: Fix usages of apis deprecated in Gradle 8 2023-03-20 19:45:39 +00:00
Sergej Jaskiewicz de7de7b287 [IR] Add kdoc for IrElement 2023-03-17 13:55:13 +00:00
Sergej Jaskiewicz ba5ff7967c [IR] Don't use @sample in generated kdocs
`@sample` is used for showing usage examples, not the generation
template.

IDEA shows the body of the method referenced in `@sample` in
the class's kdoc, which pollutes the docs with irrelevant code.
2023-03-17 13:55:13 +00:00
Sergej Jaskiewicz f96ff6d52d [IR] Add a kdoc for IrMetadataSourceOwner 2023-03-17 13:55:12 +00:00
Sergej Jaskiewicz 396451b5da [IR] Support specifying kdocs for properties in IR tree generator 2023-03-17 13:55:12 +00:00
Sergej Jaskiewicz b3e5612f79 [IR] Unescape identifiers in tree generator more accurately
Simply removing all backticks makes kdocs with code blocks ugly
2023-03-17 13:55:12 +00:00
Ivan Kylchik 4ab38ffcfc Extract some common code into extractRelatedDeclaration 2023-03-14 20:47:44 +00:00
Ivan Kylchik 4fc95624a0 Rename attributeOwnerIdBeforeInline to originalBeforeInline 2023-03-14 20:47:44 +00:00
Ivan Kylchik 4506ca6792 Add KDoc to IrAttributeContainer 2023-03-14 20:47:43 +00:00
Ivan Kylchik ab2c3572ab Drop all usages of inlineFunctionSymbol in IrReturnableBlock 2023-03-14 20:47:41 +00:00
Ivan Kylchik 32a7633c06 Support smap creation for functions inlined with IR inliner 2023-03-14 20:47:38 +00:00
Ivan Kylchik 4baf970d5b Collect classes for JVM that must be regenerated after IR inline 2023-03-14 20:47:35 +00:00
Ivan Kylchik 60702f0f02 Add new filed attributeOwnerIdBeforeInline to IrAttributeContainer
This field is null by default, and it is set to current
`attributeOwnerId` when declaration was inlined and must be
generated with new name. In its turn `attributeOwnerId` must be set to
`this` to show that this is actually a new declaration, not a copy.
2023-03-14 20:47:35 +00:00
Ivan Kylchik ef78196cbc Replace all usages of inlineFunctionSymbol with inlineFunction 2023-03-14 20:47:34 +00:00
Ivan Kylchik ebf6e69ef3 Add new IR node IrInlinedFunctionBlock
This node will represent inlined in IR function.
2023-03-14 20:47:33 +00:00
Denis.Zharkov eb09a25239 TypeSystemContext: Rework raw types processing
All the current usages are about checking if the type is raw,
also in K2 it is simply incorrect to assume that only flexible types
might be raw
2023-03-10 18:35:00 +00:00
Alexander Udalov d96112b944 Remove dependency of fir2ir/fir.entrypoint on psi2ir 2023-03-10 17:49:35 +00:00
Artem Kobzar ab7b429298 [K/JS] Add ability to use is checks on external objects 2023-03-10 11:33:30 +00:00
Igor Chevdar ea7c851748 [K/N][IR][codegen] Fixed a number of thread safety problems 2023-03-10 11:05:55 +00:00
Artem Kobzar 26f6661d1e [K/JS] Remove the possibility to have negative lines and columns in Source Maps 2023-03-06 16:55:26 +00:00
Mikhail Glukhikh 37838963c6 IR: extract AbstractIrLazyFunction and tryLoadIr 2023-02-28 10:07:28 +00:00
Mikhail Glukhikh f075c9d50b IR: extract & rename getTopLevelDeclaration() to IrLazyFunctionBase 2023-02-28 10:07:28 +00:00
Alexander Udalov 22b4b29292 IR: make most properties mutable 2023-02-22 22:40:34 +00:00
Alexander Udalov d2938e732a IR: remove IrTypeOperatorCall.typeOperandClassifier 2023-02-22 22:40:34 +00:00
Alexander Udalov 42daeaaa80 IR: remove IrCallableReference.referencedName
It was added in 66da676b9e to avoid dependency on descriptors, but now
it doesn't use descriptors anyway, so it's better to inline it than have
it in the interface.
2023-02-22 22:40:33 +00:00
Alexander Udalov d286409b76 IR: make IrComposite.isTransparentScope an extension 2023-02-22 22:40:33 +00:00