├── .github
└── workflows
│ ├── ci.yml
│ └── clean.yml
├── .gitignore
├── LICENSE
├── README.md
├── build.sbt
├── project
├── build.properties
└── plugins.sbt
├── scex-core
└── src
│ ├── main
│ └── scala
│ │ └── com
│ │ └── avsystem
│ │ └── scex
│ │ ├── EvaluationException.scala
│ │ ├── Expression.scala
│ │ ├── ExpressionContext.scala
│ │ ├── ExpressionDebugInfo.scala
│ │ ├── ExpressionProfile.scala
│ │ ├── NamedSource.scala
│ │ ├── Setter.scala
│ │ ├── Type.scala
│ │ ├── compiler
│ │ ├── CachingScexCompiler.scala
│ │ ├── ClassfileReusingScexCompiler.scala
│ │ ├── CodeGeneration.scala
│ │ ├── ContextTypeInfo.scala
│ │ ├── DefaultScexCompiler.scala
│ │ ├── ExpressionDef.scala
│ │ ├── ExpressionMacroProcessor.scala
│ │ ├── ExpressionSourceFile.scala
│ │ ├── ExpressionTreeAttachment.scala
│ │ ├── JavaTypeParsing.scala
│ │ ├── Markers.scala
│ │ ├── ScexCompiler.scala
│ │ ├── ScexGlobal.scala
│ │ ├── ScexSettings.scala
│ │ ├── ScexSourceFile.scala
│ │ ├── SourceInfo.scala
│ │ ├── SymbolErasures.scala
│ │ ├── TemplateInterpolations.scala
│ │ ├── TemplateOptimizingScexCompiler.scala
│ │ ├── WeakReferenceWrappingScexCompiler.scala
│ │ ├── annotation
│ │ │ ├── Input.scala
│ │ │ ├── NotValidated.scala
│ │ │ ├── RootAdapter.scala
│ │ │ └── RootValue.scala
│ │ ├── presentation
│ │ │ ├── CachingScexPresentationCompiler.scala
│ │ │ ├── IGlobal.scala
│ │ │ ├── ScexPresentationCompiler.scala
│ │ │ └── ast
│ │ │ │ ├── Attachments.scala
│ │ │ │ ├── Flags.scala
│ │ │ │ ├── Modifiers.scala
│ │ │ │ ├── Name.scala
│ │ │ │ ├── PrettyPrint.scala
│ │ │ │ ├── Translator.scala
│ │ │ │ └── Tree.scala
│ │ └── xmlfriendly
│ │ │ ├── XmlFriendlyScexCompiler.scala
│ │ │ └── XmlFriendlyTranslator.scala
│ │ ├── japi
│ │ ├── DefaultJavaScexCompiler.scala
│ │ ├── JavaExpressionContext.scala
│ │ ├── JavaScexCompiler.scala
│ │ ├── ScalaTypeTokens.scala
│ │ └── XmlFriendlyJavaScexCompiler.scala
│ │ ├── parsing
│ │ ├── PString.scala
│ │ ├── PositionMapping.scala
│ │ ├── PositionTrackingParsers.scala
│ │ ├── ScalaParsingCommons.scala
│ │ └── TemplateParser.scala
│ │ ├── presentation
│ │ ├── Attributes.scala
│ │ ├── MathAttributes.scala
│ │ ├── SymbolAttributes.scala
│ │ └── annotation
│ │ │ ├── Documentation.java
│ │ │ └── ParameterNames.java
│ │ ├── symboldsl
│ │ ├── SymbolDsl.scala
│ │ ├── SymbolInfo.scala
│ │ ├── SymbolInfoList.scala
│ │ └── TypeInfo.scala
│ │ ├── util
│ │ ├── CacheImplicits.scala
│ │ ├── CommonUtils.scala
│ │ ├── DynamicAdapters.scala
│ │ ├── DynamicVariableAccessor.scala
│ │ ├── Fluent.scala
│ │ ├── Literal.scala
│ │ ├── LoggingUtils.scala
│ │ ├── NamingThreadFactory.scala
│ │ ├── PredefinedAccessSpecs.scala
│ │ ├── SimpleContext.scala
│ │ └── TypesafeEquals.scala
│ │ └── validation
│ │ ├── SymbolValidator.scala
│ │ ├── SyntaxValidator.scala
│ │ └── ValidationContext.scala
│ └── test
│ ├── java
│ └── com
│ │ └── avsystem
│ │ └── scex
│ │ └── compiler
│ │ ├── BaseOne.java
│ │ ├── BaseTwo.java
│ │ ├── BoundedParameterizedClass.java
│ │ ├── DerivedJavaRoot.java
│ │ ├── EnumInside.java
│ │ ├── JavaRoot.java
│ │ ├── JavaRootWithGetter.java
│ │ ├── JavaSetterTarget.java
│ │ ├── JavaTypes.java
│ │ ├── OuterClass.java
│ │ ├── ParameterizedClass.java
│ │ ├── RecursiveGenericClass.java
│ │ ├── SubRoot.java
│ │ └── overriding
│ │ ├── Base.java
│ │ ├── DynamicGetter.java
│ │ ├── GenericBase.java
│ │ ├── Klass.java
│ │ └── Specialized.java
│ ├── resources
│ └── logback.xml
│ └── scala
│ └── com
│ └── avsystem
│ └── scex
│ └── compiler
│ ├── ArbitraryCompilationTest.scala
│ ├── ClassTaggedContext.scala
│ ├── ClassfileReusingTest.scala
│ ├── CompilationTest.scala
│ ├── ContextAccessingRoot.scala
│ ├── DynamicVariables.scala
│ ├── FancySplicedRoot.scala
│ ├── InterceptingPluginScexCompiler.scala
│ ├── JavaScexCompilerTest.scala
│ ├── JavaTypeParsingTest.scala
│ ├── LiteralExpressionsTest.scala
│ ├── OufOfDateUnitScexCompilerTest.scala
│ ├── ScalaParsingCommonsTest.scala
│ ├── ScalaTypeTokensTest.scala
│ ├── ScexCompilationCachingTest.scala
│ ├── ScexCompilerTest.scala
│ ├── SetterExpressionsTest.scala
│ ├── ShiftInfoPositionMappingTest.scala
│ ├── SomeDynamic.scala
│ ├── TemplateExpressionsTest.scala
│ ├── TemplateParserTest.scala
│ ├── TestExtensions.scala
│ ├── TestUtils.scala
│ ├── TypesafeEqualsTest.scala
│ ├── ValueRoot.scala
│ ├── presentation
│ ├── CompletionTest.scala
│ ├── ScopeAndTypeCompletionTest.scala
│ └── TypeCompletionPrefixTest.scala
│ └── xmlfriendly
│ ├── PStringTest.scala
│ ├── XmlFriendlyCompilerTest.scala
│ └── XmlFriendlyTranslatorTest.scala
├── scex-macros
└── src
│ └── main
│ ├── scala-2.12
│ └── com
│ │ └── avsystem
│ │ └── scex
│ │ └── util
│ │ └── CrossMacroUtils.scala
│ ├── scala-2.13
│ └── com
│ │ └── avsystem
│ │ └── scex
│ │ └── util
│ │ └── CrossMacroUtils.scala
│ └── scala
│ └── com
│ └── avsystem
│ └── scex
│ ├── Macros.scala
│ ├── symboldsl
│ ├── SymbolDslMacros.scala
│ └── SymbolInfoParser.scala
│ └── util
│ ├── MacroUtils.scala
│ └── TypeWrapper.scala
├── scex-test
└── src
│ └── main
│ ├── java
│ ├── BaseBridge.java
│ ├── BaseStatic.java
│ ├── ConcreteBridge.java
│ ├── JavaClass.java
│ ├── JavaDynamic.java
│ ├── JavaLol.java
│ ├── Static.java
│ └── TypedLol.java
│ ├── resources
│ └── logback.xml
│ └── scala
│ ├── AutoConvertTest.scala
│ ├── ExistentialCase.scala
│ ├── MemoryTest.scala
│ ├── MethodTypes.scala
│ ├── Playground.scala
│ ├── ScalaClass.scala
│ ├── SymbolValidatorTests.scala
│ ├── Target.scala
│ ├── TemplateOptimizingPerformanceTest.scala
│ ├── TypeConvertersTest.scala
│ ├── ValidationTest.scala
│ ├── WildcardsTest.scala
│ └── com
│ └── avsystem
│ └── scex
│ └── example
│ └── Quickstart.scala
└── scex-util
└── src
├── main
└── scala
│ └── com
│ └── avsystem
│ └── scex
│ └── util
│ ├── Bytes.scala
│ ├── CommonDateFormat.scala
│ ├── CommonExpressionUtils.scala
│ ├── CommonSymbolValidators.scala
│ ├── EnrichedArray.scala
│ ├── EnrichedDate.scala
│ ├── EscapedBytes.scala
│ ├── ExpressionRecoverableException.scala
│ ├── JavaCollectionExtensions.scala
│ ├── StringMiscOps.scala
│ ├── StringNetworkOps.scala
│ └── function
│ ├── DateUtil.java
│ ├── DateUtilImpl.java
│ ├── FormatUtil.java
│ ├── FormatUtilImpl.java
│ ├── NetFunctions.java
│ ├── NetUtil.java
│ ├── NetUtilImpl.java
│ ├── StringFunctions.java
│ ├── StringUtil.java
│ └── StringUtilImpl.java
└── test
└── scala
└── com
└── avsystem
└── scex
└── util
├── EnrichedDateTest.scala
└── QmarkTest.scala
/.github/workflows/ci.yml:
--------------------------------------------------------------------------------
1 | # This file was automatically generated by sbt-github-actions using the
2 | # githubWorkflowGenerate task. You should add and commit this file to
3 | # your git repository. It goes without saying that you shouldn't edit
4 | # this file by hand! Instead, if you wish to make changes, you should
5 | # change your sbt build configuration to revise the workflow description
6 | # to meet your needs, then regenerate this file.
7 |
8 | name: Continuous Integration
9 |
10 | on:
11 | pull_request:
12 | branches: ['**']
13 | push:
14 | branches: ['**']
15 | tags: [v*]
16 |
17 | env:
18 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
19 |
20 | jobs:
21 | build:
22 | name: Build and Test
23 | strategy:
24 | matrix:
25 | os: [ubuntu-latest]
26 | scala: [2.13.16]
27 | java: [temurin@17, temurin@21]
28 | runs-on: ${{ matrix.os }}
29 | steps:
30 | - name: Checkout current branch (full)
31 | uses: actions/checkout@v4
32 | with:
33 | fetch-depth: 0
34 |
35 | - name: Setup Java (temurin@17)
36 | if: matrix.java == 'temurin@17'
37 | uses: actions/setup-java@v4
38 | with:
39 | distribution: temurin
40 | java-version: 17
41 | cache: sbt
42 |
43 | - name: Setup Java (temurin@21)
44 | if: matrix.java == 'temurin@21'
45 | uses: actions/setup-java@v4
46 | with:
47 | distribution: temurin
48 | java-version: 21
49 | cache: sbt
50 |
51 | - name: Setup sbt
52 | uses: sbt/setup-sbt@v1
53 |
54 | - name: Check that workflows are up to date
55 | run: sbt '++ ${{ matrix.scala }}' githubWorkflowCheck
56 |
57 | - name: Build project
58 | run: sbt '++ ${{ matrix.scala }}' test
59 |
60 | - name: Compress target directories
61 | run: tar cf targets.tar scex-macros/target scex-core/target scex-test/target scex-util/target target project/target
62 |
63 | - name: Upload target directories
64 | uses: actions/upload-artifact@v4
65 | with:
66 | name: target-${{ matrix.os }}-${{ matrix.scala }}-${{ matrix.java }}
67 | path: targets.tar
68 |
69 | publish:
70 | name: Publish Artifacts
71 | needs: [build]
72 | if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v'))
73 | strategy:
74 | matrix:
75 | os: [ubuntu-latest]
76 | scala: [2.13.16]
77 | java: [temurin@17]
78 | runs-on: ${{ matrix.os }}
79 | steps:
80 | - name: Checkout current branch (full)
81 | uses: actions/checkout@v4
82 | with:
83 | fetch-depth: 0
84 |
85 | - name: Setup Java (temurin@17)
86 | if: matrix.java == 'temurin@17'
87 | uses: actions/setup-java@v4
88 | with:
89 | distribution: temurin
90 | java-version: 17
91 | cache: sbt
92 |
93 | - name: Setup Java (temurin@21)
94 | if: matrix.java == 'temurin@21'
95 | uses: actions/setup-java@v4
96 | with:
97 | distribution: temurin
98 | java-version: 21
99 | cache: sbt
100 |
101 | - name: Setup sbt
102 | uses: sbt/setup-sbt@v1
103 |
104 | - name: Download target directories (2.13.16)
105 | uses: actions/download-artifact@v4
106 | with:
107 | name: target-${{ matrix.os }}-2.13.16-${{ matrix.java }}
108 |
109 | - name: Inflate target directories (2.13.16)
110 | run: |
111 | tar xf targets.tar
112 | rm targets.tar
113 |
114 | - env:
115 | PGP_PASSPHRASE: ${{ secrets.PGP_PASSPHRASE }}
116 | PGP_SECRET: ${{ secrets.PGP_SECRET }}
117 | SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }}
118 | SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }}
119 | run: sbt ci-release
120 |
--------------------------------------------------------------------------------
/.github/workflows/clean.yml:
--------------------------------------------------------------------------------
1 | # This file was automatically generated by sbt-github-actions using the
2 | # githubWorkflowGenerate task. You should add and commit this file to
3 | # your git repository. It goes without saying that you shouldn't edit
4 | # this file by hand! Instead, if you wish to make changes, you should
5 | # change your sbt build configuration to revise the workflow description
6 | # to meet your needs, then regenerate this file.
7 |
8 | name: Clean
9 |
10 | on: push
11 |
12 | jobs:
13 | delete-artifacts:
14 | name: Delete Artifacts
15 | runs-on: ubuntu-latest
16 | env:
17 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
18 | steps:
19 | - name: Delete artifacts
20 | shell: bash {0}
21 | run: |
22 | # Customize those three lines with your repository and credentials:
23 | REPO=${GITHUB_API_URL}/repos/${{ github.repository }}
24 |
25 | # A shortcut to call GitHub API.
26 | ghapi() { curl --silent --location --user _:$GITHUB_TOKEN "$@"; }
27 |
28 | # A temporary file which receives HTTP response headers.
29 | TMPFILE=$(mktemp)
30 |
31 | # An associative array, key: artifact name, value: number of artifacts of that name.
32 | declare -A ARTCOUNT
33 |
34 | # Process all artifacts on this repository, loop on returned "pages".
35 | URL=$REPO/actions/artifacts
36 | while [[ -n "$URL" ]]; do
37 |
38 | # Get current page, get response headers in a temporary file.
39 | JSON=$(ghapi --dump-header $TMPFILE "$URL")
40 |
41 | # Get URL of next page. Will be empty if we are at the last page.
42 | URL=$(grep '^Link:' "$TMPFILE" | tr ',' '\n' | grep 'rel="next"' | head -1 | sed -e 's/.*/' -e 's/>.*//')
43 | rm -f $TMPFILE
44 |
45 | # Number of artifacts on this page:
46 | COUNT=$(( $(jq <<<$JSON -r '.artifacts | length') ))
47 |
48 | # Loop on all artifacts on this page.
49 | for ((i=0; $i < $COUNT; i++)); do
50 |
51 | # Get name of artifact and count instances of this name.
52 | name=$(jq <<<$JSON -r ".artifacts[$i].name?")
53 | ARTCOUNT[$name]=$(( $(( ${ARTCOUNT[$name]} )) + 1))
54 |
55 | id=$(jq <<<$JSON -r ".artifacts[$i].id?")
56 | size=$(( $(jq <<<$JSON -r ".artifacts[$i].size_in_bytes?") ))
57 | printf "Deleting '%s' #%d, %'d bytes\n" $name ${ARTCOUNT[$name]} $size
58 | ghapi -X DELETE $REPO/actions/artifacts/$id
59 | done
60 | done
61 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.ld
2 | *.log
3 | *.class
4 | .idea
5 | !.idea/vcs.xml
6 | !.idea/codeStyleSettings.xml
7 |
8 | *.iws
9 | *.iml
10 | *.ipr
11 |
12 | license.dat
13 | public.key
14 | target
15 | build
16 | out
17 | testClassfileCache
18 | classfileCache
19 | scex_classes
20 | .bsp/
21 |
22 | *~
23 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2015 AVSystem