├── .gitattributes
├── .github
└── workflows
│ └── ci.yml
├── .gitignore
├── Jenkinsfile
├── README.md
├── build
├── build_utils.sh
├── common
├── apps
│ ├── erlide_builder
│ │ ├── .project
│ │ ├── .settings
│ │ │ ├── org.erlide.core.prefs
│ │ │ └── org.erlide.model.prefs
│ │ ├── include
│ │ │ └── .keep
│ │ ├── priv
│ │ │ └── .keep
│ │ └── src
│ │ │ ├── erlide_builder.app.src
│ │ │ ├── erlide_builder.erl
│ │ │ ├── erlide_builder_app.erl
│ │ │ ├── erlide_builder_server.erl
│ │ │ ├── erlide_builder_slave.erl
│ │ │ ├── erlide_erlcerrors.erl
│ │ │ └── erlide_yecc_msgs.erl
│ ├── erlide_common
│ │ ├── .project
│ │ ├── .settings
│ │ │ ├── org.eclipse.core.resources.prefs
│ │ │ ├── org.erlide.core.prefs
│ │ │ └── org.erlide.model.prefs
│ │ ├── include
│ │ │ └── erlide_dbglog.hrl
│ │ ├── priv
│ │ │ └── .keep
│ │ ├── src
│ │ │ ├── erlide_backend.erl
│ │ │ ├── erlide_common.app.src
│ │ │ ├── erlide_common_app.erl
│ │ │ ├── erlide_jrpc.erl
│ │ │ ├── erlide_log.erl
│ │ │ ├── erlide_monitor.erl
│ │ │ ├── erlide_pool.erl
│ │ │ ├── erlide_proclist.erl
│ │ │ ├── erlide_shell.erl
│ │ │ ├── erlide_user.erl
│ │ │ └── erlide_util.erl
│ │ └── test
│ │ │ └── erlide_util_tests.erl
│ └── erlide_tools
│ │ ├── .project
│ │ ├── .settings
│ │ ├── org.eclipse.core.resources.prefs
│ │ ├── org.erlide.core.prefs
│ │ └── org.erlide.model.prefs
│ │ ├── include
│ │ ├── .keep
│ │ └── erlide_dbglog.hrl
│ │ ├── priv
│ │ └── .keep
│ │ └── src
│ │ ├── erlide_dialyze.erl
│ │ ├── erlide_eunit_listener.erl
│ │ ├── erlide_tools.app.src
│ │ ├── erlide_tools_app.erl
│ │ ├── observer_backend.erl
│ │ ├── observer_backend.hrl
│ │ ├── proc_list.erl
│ │ ├── runtime_tools_sup.erl
│ │ ├── ttb_autostart.erl
│ │ ├── ttb_integration.erl
│ │ └── ttbe.erl
├── build
├── rebar.config
└── rebar.lock
├── debugger
├── build
├── erlide_debugger
│ ├── .project
│ ├── .settings
│ │ ├── org.eclipse.core.resources.prefs
│ │ ├── org.erlide.core.prefs
│ │ └── org.erlide.model.prefs
│ ├── build
│ ├── include
│ │ ├── .keep
│ │ └── erlide_dbglog.hrl
│ ├── priv
│ │ └── .keep
│ ├── rebar.config
│ ├── rebar.lock
│ └── src
│ │ ├── coverage.erl
│ │ ├── coverage.hrl
│ │ ├── dbg_mon.erl
│ │ ├── erlide_dbg.erl
│ │ ├── erlide_debug.erl
│ │ ├── erlide_debugger.app.src
│ │ ├── erlide_tracer.erl
│ │ ├── launcher.erl
│ │ ├── test.hrl
│ │ ├── test_listener.erl
│ │ └── testlauncher.erl
├── erlide_debugger_25
│ ├── build
│ ├── include
│ │ └── .keep
│ ├── priv
│ │ └── .keep
│ ├── rebar.config
│ ├── rebar.lock
│ └── src
│ │ ├── dbg_debugged.erl
│ │ ├── dbg_icmd.erl
│ │ ├── dbg_idb.erl
│ │ ├── dbg_ieval.erl
│ │ ├── dbg_ieval.hrl
│ │ ├── dbg_iload.erl
│ │ ├── dbg_iserver.erl
│ │ ├── dbg_istk.erl
│ │ ├── erlide_debugger_25.app.src
│ │ └── int.erl
├── erlide_debugger_26
│ ├── build
│ ├── include
│ │ └── .keep
│ ├── priv
│ │ └── .keep
│ ├── rebar.config
│ ├── rebar.lock
│ └── src
│ │ ├── dbg_debugged.erl
│ │ ├── dbg_icmd.erl
│ │ ├── dbg_idb.erl
│ │ ├── dbg_ieval.erl
│ │ ├── dbg_ieval.hrl
│ │ ├── dbg_iload.erl
│ │ ├── dbg_iserver.erl
│ │ ├── dbg_istk.erl
│ │ ├── erlide_debugger_26.app.src
│ │ └── int.erl
└── erlide_debugger_27
│ ├── build
│ ├── include
│ └── .keep
│ ├── priv
│ └── .keep
│ ├── rebar.config
│ ├── rebar.lock
│ └── src
│ ├── dbg_debugged.erl
│ ├── dbg_icmd.erl
│ ├── dbg_idb.erl
│ ├── dbg_ieval.erl
│ ├── dbg_ieval.hrl
│ ├── dbg_iload.erl
│ ├── dbg_iserver.erl
│ ├── dbg_istk.erl
│ ├── erlide_debugger_27.app.src
│ └── int.erl
├── docs
├── articles
│ └── kernel
│ │ └── .keep
└── model_api.md
├── eclipse
├── .gitignore
├── .mvn
│ ├── extensions.xml
│ └── wrapper
│ │ ├── maven-wrapper.jar
│ │ └── maven-wrapper.properties
├── build
├── mvnw
├── mvnw.cmd
├── org.erlide.kernel.common
│ ├── .gitignore
│ ├── .project
│ ├── .settings
│ │ ├── org.eclipse.core.resources.prefs
│ │ └── org.eclipse.m2e.core.prefs
│ ├── META-INF
│ │ └── MANIFEST.MF
│ ├── build.properties
│ ├── plugin.xml
│ └── pom.xml
├── org.erlide.kernel.debugger
│ ├── .gitignore
│ ├── .project
│ ├── .settings
│ │ ├── org.eclipse.core.resources.prefs
│ │ └── org.eclipse.m2e.core.prefs
│ ├── META-INF
│ │ └── MANIFEST.MF
│ ├── build.properties
│ ├── plugin.xml
│ └── pom.xml
├── org.erlide.kernel.feature
│ ├── .project
│ ├── .settings
│ │ ├── org.eclipse.core.resources.prefs
│ │ ├── org.eclipse.m2e.core.prefs
│ │ └── org.eclipse.xtend.core.Xtend.prefs
│ ├── build.properties
│ ├── feature.properties
│ ├── feature.xml
│ ├── plugin_customization.ini
│ └── pom.xml
├── org.erlide.kernel.ide
│ ├── .gitignore
│ ├── .project
│ ├── .settings
│ │ ├── org.eclipse.core.resources.prefs
│ │ └── org.eclipse.m2e.core.prefs
│ ├── META-INF
│ │ └── MANIFEST.MF
│ ├── build.properties
│ ├── plugin.xml
│ └── pom.xml
├── org.erlide.kernel.site
│ ├── .project
│ ├── .settings
│ │ └── org.eclipse.core.resources.prefs
│ ├── category.xml
│ └── pom.xml
├── org.erlide.kernel.target
│ ├── .project
│ ├── .settings
│ │ ├── org.eclipse.core.resources.prefs
│ │ └── org.eclipse.m2e.core.prefs
│ ├── org.erlide.kernel.target.target
│ └── pom.xml
├── pom.xml
└── publish
├── ide
├── apps
│ ├── erlide_ide
│ │ ├── .project
│ │ ├── .settings
│ │ │ ├── org.eclipse.core.resources.prefs
│ │ │ ├── org.erlide.core.prefs
│ │ │ └── org.erlide.model.prefs
│ │ ├── data
│ │ │ └── test_unicode.erl
│ │ ├── include
│ │ │ └── erlide_open.hrl
│ │ ├── priv
│ │ │ └── .keep
│ │ ├── src
│ │ │ ├── erlide_comment.erl
│ │ │ ├── erlide_content_assist.erl
│ │ │ ├── erlide_ide.app.src
│ │ │ ├── erlide_indent.erl
│ │ │ ├── erlide_model.erl
│ │ │ ├── erlide_open.erl
│ │ │ ├── erlide_otp_doc.erl
│ │ │ ├── erlide_search.erl
│ │ │ ├── erlide_search_server.erl
│ │ │ └── erlide_xref.erl
│ │ └── test
│ │ │ ├── erlide_indent_tests.erl
│ │ │ ├── erlide_open_tests.erl
│ │ │ └── erlide_search_tests.erl
│ └── erlide_ide_core
│ │ ├── .project
│ │ ├── .settings
│ │ ├── org.eclipse.core.resources.prefs
│ │ ├── org.erlide.core.prefs
│ │ └── org.erlide.model.prefs
│ │ ├── include
│ │ ├── erlide_noparse.hrl
│ │ ├── erlide_scanner_server.hrl
│ │ ├── erlide_search.hrl
│ │ └── erlide_token.hrl
│ │ ├── priv
│ │ └── .keep
│ │ ├── src
│ │ ├── erl_scan_local.erl
│ │ ├── erlide_cache.erl
│ │ ├── erlide_ide_core.app.src
│ │ ├── erlide_noparse.erl
│ │ ├── erlide_np.erl
│ │ ├── erlide_np_records.erl
│ │ ├── erlide_np_util.erl
│ │ ├── erlide_parse.erl
│ │ ├── erlide_scan.erl
│ │ ├── erlide_scan_model.erl
│ │ ├── erlide_scan_util.erl
│ │ ├── erlide_scanner.erl
│ │ ├── erlide_scanner_server.erl
│ │ └── erlide_text.erl
│ │ └── test
│ │ ├── erlide_parse_tests.erl
│ │ ├── erlide_parsing_tests.erl
│ │ ├── erlide_scan_model_tests.erl
│ │ ├── erlide_scan_tests.erl
│ │ └── erlide_scanner_tests.erl
├── build
├── rebar.config
└── rebar.lock
├── rebar.lock
└── rebar3
/.gitattributes:
--------------------------------------------------------------------------------
1 | text eol=lf
2 |
3 | *.jpg binary
4 | *.png binary
5 | *.gif binary
6 |
7 |
--------------------------------------------------------------------------------
/.github/workflows/ci.yml:
--------------------------------------------------------------------------------
1 | name: CI
2 |
3 | on: [push, pull_request]
4 |
5 | jobs:
6 | build:
7 | runs-on: ubuntu-24.04
8 | steps:
9 | - uses: actions/checkout@v4
10 | - uses: actions/cache@v4
11 | with:
12 | path: |
13 | ~/erlide_tools
14 | ~/.kerl
15 | key: ${{ runner.os }}-otp-${{ hashFiles('build_utils.sh') }}
16 | - name: Set up JDK 1.8
17 | uses: actions/setup-java@v4
18 | with:
19 | java-version: '8'
20 | distribution: 'zulu'
21 | cache: 'maven'
22 | - name: Build
23 | run: ./build
24 | - name: Test
25 | run: ./build test
26 | - name: Dialyzer
27 | continue-on-error: true # Until problems are fixed
28 | run: ./build dialyzer
29 | - name: Xref
30 | continue-on-error: true # Until problems are fixed
31 | run: ./build xref
32 | - name: Build zip archive for Eclipse
33 | run: cd eclipse && ./build
34 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | target
2 | .rebar
3 | .eunit
4 | _build
5 | *.o
6 | *.beam
7 | *.plt
8 | erl_crash.dump
9 | target/
10 |
11 | **/ebin/*.app
12 | *.orig
13 | *.rej
14 |
15 | *.bak
16 | .nfs*
17 | .~lock.*
18 |
19 | .gradle
20 | deps/
21 | build/
22 |
23 | *.diff
24 | TEST-*.*
25 |
26 |
27 |
28 | server/erlide_ide
29 | *.crashdump
30 |
--------------------------------------------------------------------------------
/Jenkinsfile:
--------------------------------------------------------------------------------
1 | #!groovy
2 |
3 | pipeline {
4 | agent any
5 | options {
6 | disableConcurrentBuilds()
7 | timestamps()
8 | skipDefaultCheckout()
9 | buildDiscarder(logRotator(numToKeepStr: '10'))
10 | }
11 | stages {
12 | stage('Checkout') {
13 | steps{
14 | retry(3) {
15 | timeout(time: 30, unit: 'SECONDS') {
16 | script {
17 | checkout()
18 | }
19 | }
20 | }
21 | }
22 | }
23 |
24 | stage('Compile') {
25 | steps{
26 | script {
27 | compile()
28 | analyze1()
29 | }
30 | }
31 | }
32 |
33 | stage('Test') {
34 | steps{
35 | script {
36 | test()
37 | analyze2()
38 | }
39 | }
40 | }
41 |
42 | stage('Eclipse') {
43 | steps{
44 | script {
45 | buildEclipse()
46 | publishEclipse()
47 | }
48 | }
49 | }
50 | }
51 | //post {
52 | //always {
53 | //deleteDir()
54 | //}
55 | //}
56 |
57 |
58 | }
59 |
60 | ///////////////////////////////////
61 |
62 | def checkout() {
63 | deleteDir()
64 | checkout scm
65 | git_branch = env.BRANCH_NAME
66 |
67 | sh('git rev-parse HEAD > GIT_COMMIT')
68 | git_commit=readFile('GIT_COMMIT')
69 | short_commit=git_commit.take(6)
70 |
71 | currentBuild.setDescription("${git_branch} - ${short_commit}")
72 | }
73 |
74 | def compile() {
75 | sh "chmod u+x build"
76 | sh "./build"
77 | sleep 2L
78 | }
79 |
80 | def test() {
81 | sh "chmod u+x build"
82 | sh "./build test"
83 | sleep 2L
84 | sh "find . -name \"TEST-*.xml\" -exec xargs rename -v 's/\"//' {} \\;"
85 | }
86 |
87 | def analyze1() {
88 | step([$class: 'WarningsPublisher', canComputeNew: false, canResolveRelativePaths: true, canRunOnFailed: true,
89 | consoleParsers: [[parserName: 'Erlang Compiler (erlc)'], [parserName: 'Maven']],
90 | excludePattern: '', healthy: '', includePattern: '', messagesPattern: '', unHealthy: ''])
91 | step([$class: 'TasksPublisher', canComputeNew: false, excludePattern: '**/_build/**/*.*', healthy: '', high: 'FIXME,XXX', low: '', normal: 'TODO', pattern: '**/*.erl,**/*.hrl', unHealthy: ''])
92 | }
93 |
94 | def analyze2() {
95 | step([$class: 'AnalysisPublisher', canComputeNew: false, healthy: '', unHealthy: ''])
96 | step([$class: 'JUnitResultArchiver', allowEmptyResults: true, testResults: '**/TEST*.xml'])
97 | //step([$class: 'JacocoPublisher', exclusionPattern: '', sourcePattern: '**/src/'])
98 | // we need Cobertura...
99 | // publishHTML([
100 | // allowMissing: false,
101 | // alwaysLinkToLastBuild: false,
102 | // keepAll: true,
103 | // reportDir: '',
104 | // reportFiles:
105 | // '''common/_build/test/index.html
106 | // ''',
107 | // reportName: 'Coverage Report'
108 | // ])
109 | }
110 |
111 | def buildEclipse() {
112 | sh "cd eclipse && ./build && cd .."
113 | step([$class: 'ArtifactArchiver', artifacts: "eclipse/org.erlide.kernel.site-*.zip", fingerprint: true])
114 | }
115 |
116 | @NonCPS
117 | def getVersion(String archive) {
118 | def m = (archive =~ /org.erlide.kernel[-_]([0-9]+\.[0-9]+\.[0-9]+)(\.(.+))?.zip/)
119 | return m[0]
120 | }
121 |
122 | def publishEclipse() {
123 | def archive = "org.erlide.kernel.site-.zip"
124 | def isMaster = (git_branch=='master')
125 | sh "git remote get-url origin > REPO"
126 | def isMainRepo = readFile('REPO').trim().contains('github.com/erlang/')
127 |
128 | if(!isMaster || !isMainRepo) {
129 | // only do a github release if on master and in main repo
130 | return
131 | }
132 | // TODO not working for now
133 | return
134 | def v = getVersion(archive)
135 | def vsn = v[1]
136 | def ts = v[2]
137 | def vvsn = "v${vsn}"
138 | // FIXME we can't push to https git url, needs password... Jenkins Github plugin uses https...
139 | //sh "git push origin :refs/tags/${vvsn}"
140 | //sh "git fetch --prune origin +refs/tags/*:refs/tags/*"
141 |
142 | sh 'rm -rf GIT_TAG'
143 | sh 'git describe --exact-match > GIT_TAG || true'
144 | def git_tag = readFile('GIT_TAG').trim()
145 | if(git_tag == null || git_tag == '') {
146 | sh "git tag -a ${vvsn} -m ${vvsn}"
147 | //sh "git push origin ${vvsn}"
148 | git_tag = vvsn
149 | }
150 | if(git_tag != vvsn) {
151 | // if there is a tag, but it's not $vvsn, skip publishing
152 | return
153 | }
154 |
155 | def draft = true
156 | def body = ""
157 | def owner = "erlang"
158 | def repository = "erlide_kernel"
159 | def access_token = "${env.GITHUB_TOKEN___}" // the token will be printed in console output...
160 |
161 | sh "rm -rf RELEASE"
162 | def API_create="{\"tag_name\": \"${vvsn}\",\"name\": \"${vvsn}\",\"body\": \"${body}\",\"draft\": ${draft},\"prerelease\": false}"
163 | sh "curl -H \"Content-Type:application/json\" --data '${API_create}' https://api.github.com/repos/${owner}/${repository}/releases?access_token=${access_token} > RELEASE"
164 | def release = readFile('RELEASE').trim()
165 | def info = getReleaseInfo(release)
166 | if(info != null) {
167 | def release_id = info[1]
168 | sh "curl -X POST --header \"Content-Type:application/edn\" --data-binary @target/${archive} https://uploads.github.com/repos/${owner}/${repository}/releases/${release_id}/assets?access_token=${access_token}\\&name=${archive}"
169 | }
170 | }
171 |
172 | @NonCPS
173 | def getReleaseInfo(String data) {
174 | def m = (data.replaceAll("\n"," ").trim() =~ /\{[^{]*"id": *([^,]*),.*/)
175 | if(!m) return null
176 | return m[0]
177 | }
178 |
179 | def publishServer() {
180 | }
181 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | Generic Erlang engine for source code indexing and manipulation, that can be used by code editors and IDES to provide advanced functionality. This functionality will be accessible via VSCode's [Language Server Protocol](https://github.com/Microsoft/language-server-protocol) and [Debug Protocol](https://code.visualstudio.com/docs/extensionAPI/api-debugging), possibly with some extensions. The `server` application is the endpoint.
2 |
3 |
4 | # Important note
5 |
6 | **The content of this repository is highly volatile at the moment**. I am working on stabilizing it (structure, release engineering, APIs) and I will remove this notice when it is safe to use by third parties.
7 |
8 | Initially, the content is the same as it was in the erlide repository.
9 |
10 | # Description (vision)
11 |
12 | The erlide kernel will implement the core functionality of an IDE:
13 | - keep track of projects and their respective files, watch or get notified of any changes
14 | - parse the code while keeping track of the exact source text and the dependencies between files and projects
15 | - build a database of the projects' entities
16 | - expose APIs to query and update this database, for services such as
17 | - syntactic and semantic code annotations (to be used by highlighting editors, for example)
18 | - code completion
19 | - cross references (declarations, references, call graphs)
20 | - extracting documentation
21 | - refactoring
22 | - read/edit the projects' build configuration and launch build tools
23 | - launch the projects' code and interact with it (debug, trace, profile)
24 | - launch, examine and interact with Erlang nodes
25 |
26 | ## Notes
27 |
28 | * The OTP version specified in the rebar.config files for each subproject MUST be used for compilation. The `build` script installs those using `kerl` in `~/erlide_tools` (in the future the location should be configurable).
29 | * As transport for the communication protocols we will implement TCP and stdio, but others are possible.
30 |
--------------------------------------------------------------------------------
/build:
--------------------------------------------------------------------------------
1 | #! /bin/bash
2 |
3 | source ./build_utils.sh
4 |
5 | setup_otp() {
6 | echo "Setup Erlang tools - the first time, this might take 30 minutes or more, as we need to build up to 3 Erlang runtimes..."
7 | mkdir -p ~/erlide_tools
8 | if [ ! -e ~/erlide_tools/kerl ]; then
9 | curl -s 'https://raw.githubusercontent.com/kerl/kerl/master/kerl' > ~/erlide_tools/kerl
10 | chmod u+x ~/erlide_tools/kerl
11 | fi
12 | ~/erlide_tools/kerl update releases > /dev/null
13 |
14 | for v in "${OTP_VSNS[@]}"; do
15 | ~/erlide_tools/kerl build $v $v
16 | if [ ! -e ~/erlide_tools/$v ]; then
17 | ~/erlide_tools/kerl install $v ~/erlide_tools/$v
18 | else
19 | echo "OTP $v already installed"
20 | fi
21 | done
22 | }
23 |
24 | export LOCALDEP_DIR=`pwd`
25 | export REBAR_COLOR="low"
26 | #export QUIET=1
27 |
28 | main() {
29 | arg=${1:-compile}
30 |
31 | setup_otp
32 | find . -name build | xargs chmod u+x
33 |
34 | case "$arg" in
35 | "compile")
36 | cmds="do clean -a, compile -v"
37 | ;;
38 | "test")
39 | cmds="do eunit -c -v, cover -v"
40 | ;;
41 | "xref")
42 | cmds="do xref"
43 | ;;
44 | "dialyzer")
45 | cmds="do dialyzer"
46 | ;;
47 | esac
48 |
49 | set -e
50 | cd common
51 | ./build $cmds
52 | cd ../debugger
53 | ./build $cmds
54 | cd ../ide
55 | ./build $cmds
56 | if [ "$arg" == "compile" ] ; then
57 | ./build escriptize
58 | fi
59 |
60 | cd ..
61 | }
62 |
63 | main "$@"
64 |
--------------------------------------------------------------------------------
/build_utils.sh:
--------------------------------------------------------------------------------
1 | #! /bin/bash -e
2 |
3 | declare -A OTP_VSNS=( ["25"]="25.3.2.21" ["26"]="26.2.5.12" ["27"]="27.3.3" )
4 |
5 | build_project() {
6 | REBAR=$1
7 | PRJ=$2
8 | VSN=$3
9 | shift
10 | shift
11 | shift
12 |
13 | echo ""
14 | echo "Building --$PRJ-- with OTP ${OTP_VSNS[$VSN]}..."
15 | rm -rf ebin
16 | rm -rf apps/*/ebin
17 | ~/erlide_tools/${OTP_VSNS[$VSN]}/bin/escript $REBAR "$@"
18 | }
19 |
20 | get_feature_vsn() {
21 | x=`cat $1/feature.xml | grep "version=" | head -n 2 | tail -n 1 | cut -d '"' -f 2`
22 | echo "${x%.qualifier}"
23 | }
24 |
--------------------------------------------------------------------------------
/common/apps/erlide_builder/.project:
--------------------------------------------------------------------------------
1 |
2 |
3 | erlide_builder
4 |
5 |
6 |
7 |
8 |
9 | org.erlide.core.erlbuilder
10 |
11 |
12 |
13 |
14 |
15 | org.erlide.core.erlnature
16 |
17 |
18 |
--------------------------------------------------------------------------------
/common/apps/erlide_builder/.settings/org.erlide.core.prefs:
--------------------------------------------------------------------------------
1 | backend_version=17.0
2 | eclipse.preferences.version=1
3 | external_includes=
4 | external_modules=
5 | include_dirs=include;
6 | output_dir=ebin
7 | source_dirs=src;
8 |
--------------------------------------------------------------------------------
/common/apps/erlide_builder/.settings/org.erlide.model.prefs:
--------------------------------------------------------------------------------
1 | builderData=INTERNAL|compile|clean|test|
2 | configType=INTERNAL
3 | eclipse.preferences.version=1
4 |
--------------------------------------------------------------------------------
/common/apps/erlide_builder/include/.keep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erlang/erlide_kernel/ba61079066c495ad22f4da52da294cf0f97d489f/common/apps/erlide_builder/include/.keep
--------------------------------------------------------------------------------
/common/apps/erlide_builder/priv/.keep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erlang/erlide_kernel/ba61079066c495ad22f4da52da294cf0f97d489f/common/apps/erlide_builder/priv/.keep
--------------------------------------------------------------------------------
/common/apps/erlide_builder/src/erlide_builder.app.src:
--------------------------------------------------------------------------------
1 | {application, erlide_builder,
2 | [
3 | {description,"erlide_builder"},
4 | {vsn, "0.118.0"},
5 | {erlide_context, builder},
6 | {registered, []},
7 | {applications, [kernel, stdlib, erlide_common]},
8 | {env, []}
9 | ]}
10 | .
11 |
--------------------------------------------------------------------------------
/common/apps/erlide_builder/src/erlide_builder_app.erl:
--------------------------------------------------------------------------------
1 | -module(erlide_builder_app).
2 |
3 | -export([
4 | init/1
5 | ]).
6 |
7 | init(MaxParallelBuilds) ->
8 | io:format("Start builder app~n"),
9 | spawn(fun()->
10 | erlide_pool:start(erlide_builder, MaxParallelBuilds),
11 | ok
12 | end),
13 | ok.
14 |
--------------------------------------------------------------------------------
/common/apps/erlide_builder/src/erlide_builder_server.erl:
--------------------------------------------------------------------------------
1 | %%% ******************************************************************************
2 | %%% Copyright (c) 2009 Vlad Dumitrescu and others.
3 | %%% All rights reserved. This program and the accompanying materials
4 | %%% are made available under the terms of the Eclipse Public License v1.0
5 | %%% which accompanies this distribution, and is available at
6 | %%% http://www.eclipse.org/legal/epl-v10.html
7 | %%%
8 | %%% Contributors:
9 | %%% Vlad Dumitrescu
10 | %%% ******************************************************************************/
11 | %%% File : erlide_builder.erl
12 | %%% Author : Vlad Dumitrescu
13 | %%% Description :
14 |
15 | -module(erlide_builder_server).
16 |
17 | -behaviour(gen_server).
18 |
19 | %% --------------------------------------------------------------------
20 | %% Include files
21 | %% --------------------------------------------------------------------
22 |
23 | %%-define(DEBUG, 1).
24 | -include_lib("erlide_common/include/erlide_dbglog.hrl").
25 |
26 |
27 | %% --------------------------------------------------------------------
28 | %% External exports
29 | -export([
30 | start/0,
31 | stop/0,
32 | add_project/2,
33 | remove_project/1
34 | ]).
35 |
36 | %% gen_server callbacks
37 | -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
38 |
39 | -record(state, {slaves=[]}).
40 |
41 | %% ====================================================================
42 | %% External functions
43 | %% ====================================================================
44 |
45 | start() ->
46 | gen_server:start({local, ?MODULE}, ?MODULE, [], []).
47 |
48 | stop() ->
49 | gen_server:cast(?MODULE, stop).
50 |
51 | add_project(Id, Data) ->
52 | gen_server:call(?MODULE, {add_project, Id, Data}).
53 |
54 | remove_project(Id) ->
55 | gen_server:call(?MODULE, {remove_project, Id}).
56 |
57 | %% ====================================================================
58 | %% Server functions
59 | %% ====================================================================
60 |
61 | %% --------------------------------------------------------------------
62 | %% Function: init/1
63 | %% Description: Initiates the server
64 | %% Returns: {ok, State} |
65 | %% {ok, State, Timeout} |
66 | %% ignore |
67 | %% {stop, Reason}
68 | %% --------------------------------------------------------------------
69 | init(_) ->
70 | {ok, #state{}}.
71 |
72 | %% --------------------------------------------------------------------
73 | %% Function: handle_call/3
74 | %% Description: Handling call messages
75 | %% Returns: {reply, Reply, State} |
76 | %% {reply, Reply, State, Timeout} |
77 | %% {noreply, State} |
78 | %% {noreply, State, Timeout} |
79 | %% {stop, Reason, Reply, State} | (terminate/2 is called)
80 | %% {stop, Reason, State} (terminate/2 is called)
81 | %% --------------------------------------------------------------------
82 | handle_call({add_project, Id, Data}, _From, #state{slaves=Slaves}=State) ->
83 | {ok, Pid} = erlide_builder_slave:start(Id, Data),
84 | erlang:monitor(process, Pid),
85 | case lists:keytake(Id, 1, Slaves) of
86 | {value, _, _} ->
87 | {reply, {error, project_exists}, State};
88 | false ->
89 | erlide_log:log({builder_server, add_project, Id}),
90 | {reply, {ok, Pid}, State#state{slaves=[{Id, Pid} | Slaves]}}
91 | end;
92 | handle_call({remove_project, Id}, _From, #state{slaves=Slaves}=State) ->
93 | case lists:keytake(Id, 1, Slaves) of
94 | {value, {Id, Pid}, NewSlaves} ->
95 | erlide_log:log({builder_server, remove_project, Id}),
96 | erlide_builder_slave:stop(Pid),
97 | {reply, ok, State#state{slaves=NewSlaves}};
98 | false ->
99 | {reply, {error, no_project}, State}
100 | end;
101 | handle_call(Request, _From, State) ->
102 | Reply = {error, unexpected, Request},
103 | {reply, Reply, State}.
104 |
105 | %% --------------------------------------------------------------------
106 | %% Function: handle_cast/2
107 | %% Description: Handling cast messages
108 | %% Returns: {noreply, State} |
109 | %% {noreply, State, Timeout} |
110 | %% {stop, Reason, State} (terminate/2 is called)
111 | %% --------------------------------------------------------------------
112 | handle_cast(stop, State) ->
113 | {stop, normal, State};
114 | handle_cast(_Msg, State) ->
115 | {noreply, State}.
116 |
117 | %% --------------------------------------------------------------------
118 | %% Function: handle_info/2
119 | %% Description: Handling all non call/cast messages
120 | %% Returns: {noreply, State} |
121 | %% {noreply, State, Timeout} |
122 | %% {stop, Reason, State} (terminate/2 is called)
123 | %% --------------------------------------------------------------------
124 | handle_info({'DOWN', _Mref, _, Pid, _Info}, #state{slaves=Slaves}=State) ->
125 | NewSlaves = case lists:keytake(Pid, 2, Slaves) of
126 | false ->
127 | Slaves;
128 | {value, {Id, Pid}, New} ->
129 | erlide_log:log({builder_slave_died, Id}),
130 | New
131 | end,
132 | {noreply, State#state{slaves=NewSlaves}};
133 | handle_info(_Info, State) ->
134 | {noreply, State}.
135 |
136 | %% --------------------------------------------------------------------
137 | %% Function: terminate/2
138 | %% Description: Shutdown the server
139 | %% Returns: any (ignored by gen_server)
140 | %% --------------------------------------------------------------------
141 | terminate(_Reason, _State) ->
142 | ok.
143 |
144 | %% --------------------------------------------------------------------
145 | %% Func: code_change/3
146 | %% Purpose: Convert process state when code is changed
147 | %% Returns: {ok, NewState}
148 | %% --------------------------------------------------------------------
149 | code_change(_OldVsn, State, _Extra) ->
150 | {ok, State}.
151 |
152 | %% --------------------------------------------------------------------
153 | %%% Internal functions
154 | %% --------------------------------------------------------------------
155 |
156 |
157 |
158 |
--------------------------------------------------------------------------------
/common/apps/erlide_builder/src/erlide_builder_slave.erl:
--------------------------------------------------------------------------------
1 | %%% ******************************************************************************
2 | %%% Copyright (c) 2009 Vlad Dumitrescu and others.
3 | %%% All rights reserved. This program and the accompanying materials
4 | %%% are made available under the terms of the Eclipse Public License v1.0
5 | %%% which accompanies this distribution, and is available at
6 | %%% http://www.eclipse.org/legal/epl-v10.html
7 | %%%
8 | %%% Contributors:
9 | %%% Vlad Dumitrescu
10 | %%% ******************************************************************************/
11 | %%% File : erlide_builder.erl
12 | %%% Author : Vlad Dumitrescu
13 | %%% Description :
14 |
15 | -module(erlide_builder_slave).
16 |
17 | -behaviour(gen_server).
18 |
19 | %% --------------------------------------------------------------------
20 | %% Include files
21 | %% --------------------------------------------------------------------
22 |
23 | %%-define(DEBUG, 1).
24 | -include_lib("erlide_common/include/erlide_dbglog.hrl").
25 |
26 |
27 | %% --------------------------------------------------------------------
28 | %% External exports
29 | -export([
30 | start/2,
31 | stop/1,
32 | build_full/1,
33 | build_incremental/2,
34 | clean/1
35 | ]).
36 |
37 | %% gen_server callbacks
38 | -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
39 |
40 | -record(state, {id, data}).
41 |
42 | %% ====================================================================
43 | %% External functions
44 | %% ====================================================================
45 |
46 | start(Id, Configuration) ->
47 | gen_server:start(?MODULE, [Id, Configuration], []).
48 |
49 | stop(Pid) ->
50 | gen_server:cast(Pid, stop).
51 |
52 | build_full(Pid) ->
53 | gen_server:call(Pid, full_build).
54 |
55 | build_incremental(Pid, Delta) ->
56 | gen_server:call(Pid, {incremental_build, Delta}).
57 |
58 | clean(Pid) ->
59 | gen_server:call(Pid, clean).
60 |
61 |
62 | %% ====================================================================
63 | %% Server functions
64 | %% ====================================================================
65 |
66 | %% --------------------------------------------------------------------
67 | %% Function: init/1
68 | %% Description: Initiates the server
69 | %% Returns: {ok, State} |
70 | %% {ok, State, Timeout} |
71 | %% ignore |
72 | %% {stop, Reason}
73 | %% --------------------------------------------------------------------
74 | init([Id, Data]) ->
75 | erlide_log:log({builder_slave, started, Id}),
76 | {ok, #state{id=Id, data=Data}}.
77 |
78 | %% --------------------------------------------------------------------
79 | %% Function: handle_call/3
80 | %% Description: Handling call messages
81 | %% Returns: {reply, Reply, State} |
82 | %% {reply, Reply, State, Timeout} |
83 | %% {noreply, State} |
84 | %% {noreply, State, Timeout} |
85 | %% {stop, Reason, Reply, State} | (terminate/2 is called)
86 | %% {stop, Reason, State} (terminate/2 is called)
87 | %% --------------------------------------------------------------------
88 | handle_call(Request, _From, State) ->
89 | Reply = {error, unexpected, Request},
90 | {reply, Reply, State}.
91 |
92 | %% --------------------------------------------------------------------
93 | %% Function: handle_cast/2
94 | %% Description: Handling cast messages
95 | %% Returns: {noreply, State} |
96 | %% {noreply, State, Timeout} |
97 | %% {stop, Reason, State} (terminate/2 is called)
98 | %% --------------------------------------------------------------------
99 | handle_cast(stop, #state{id=Id}=State) ->
100 | erlide_log:log({builder_slave, stopped, Id}),
101 | {stop, normal, State};
102 | handle_cast(_Msg, State) ->
103 | {noreply, State}.
104 |
105 | %% --------------------------------------------------------------------
106 | %% Function: handle_info/2
107 | %% Description: Handling all non call/cast messages
108 | %% Returns: {noreply, State} |
109 | %% {noreply, State, Timeout} |
110 | %% {stop, Reason, State} (terminate/2 is called)
111 | %% --------------------------------------------------------------------
112 | handle_info(_Info, State) ->
113 | {noreply, State}.
114 |
115 | %% --------------------------------------------------------------------
116 | %% Function: terminate/2
117 | %% Description: Shutdown the server
118 | %% Returns: any (ignored by gen_server)
119 | %% --------------------------------------------------------------------
120 | terminate(_Reason, _State) ->
121 | ok.
122 |
123 | %% --------------------------------------------------------------------
124 | %% Func: code_change/3
125 | %% Purpose: Convert process state when code is changed
126 | %% Returns: {ok, NewState}
127 | %% --------------------------------------------------------------------
128 | code_change(_OldVsn, State, _Extra) ->
129 | {ok, State}.
130 |
131 | %% --------------------------------------------------------------------
132 | %%% Internal functions
133 | %% --------------------------------------------------------------------
134 |
135 |
136 |
137 |
138 |
--------------------------------------------------------------------------------
/common/apps/erlide_builder/src/erlide_erlcerrors.erl:
--------------------------------------------------------------------------------
1 | %% Author: jakob
2 | %% Created: May 11, 2006
3 | %% Description: parses error output from erlc into something more like compile:file(X, [return])
4 |
5 | -module(erlide_erlcerrors).
6 |
7 | % -define(DEBUG, 1).
8 |
9 | -include_lib("erlide_common/include/erlide_dbglog.hrl").
10 |
11 | %%
12 | %% Include files
13 | %%
14 |
15 | -define(SEVERITY_ERROR, 0).
16 | -define(SEVERITY_WARNING, 1).
17 |
18 | %%
19 | %% Exported Functions
20 | %%
21 | -export([convert_erlc_errors/1]).
22 |
23 | %%
24 | %% API Functions
25 | %%
26 | convert_erlc_errors(Text) ->
27 | ?D(Text),
28 | RevLines = erlide_text:split_lines(Text),
29 | ?D(RevLines),
30 | Errors = convert_errors(RevLines, []),
31 | ?D(Errors),
32 | Rel = sofs:relation(Errors),
33 | Fam = sofs:relation_to_family(Rel),
34 | Result = sofs:to_external(Fam),
35 | ?D(Result),
36 | Result.
37 |
38 | %%
39 | %% Local Functions
40 | %%
41 |
42 | convert_errors([], Acc) ->
43 | Acc;
44 | convert_errors([{_Offset, PossibleErrorLine} | Rest], Acc) ->
45 | case convert_error(PossibleErrorLine) of
46 | Tuple when is_tuple(Tuple) ->
47 | convert_errors(Rest, [Tuple | Acc]);
48 | _ ->
49 | convert_errors(Rest, Acc)
50 | end.
51 |
52 | convert_error(PossibleErrorLine) ->
53 | case string:tokens(PossibleErrorLine, ":") of
54 | [File, LineNoS, ErrText] ->
55 | convert_error(File, LineNoS, ErrText, ?SEVERITY_ERROR);
56 | [File, LineNoS, " Warning", WarnText] ->
57 | convert_error(File, LineNoS, WarnText, ?SEVERITY_WARNING);
58 | _ ->
59 | not_an_error_line
60 | end.
61 |
62 | convert_error(File, [Digit | _] = LineNoS, Text, Severity) when $0 =< Digit, Digit =< $9 ->
63 | case lists:suffix(".erl", File) orelse lists:suffix(".hrl", File) of
64 | true ->
65 | {File, {list_to_integer(LineNoS), module, string:strip(Text, right, $\n), Severity}};
66 | false ->
67 | not_an_error_line
68 | end;
69 | convert_error(_, _, _, _) ->
70 | not_an_error_line.
71 |
72 |
73 |
--------------------------------------------------------------------------------
/common/apps/erlide_builder/src/erlide_yecc_msgs.erl:
--------------------------------------------------------------------------------
1 | -module(erlide_yecc_msgs).
2 |
3 | %%-define(DEBUG, 1).
4 |
5 | -include_lib("erlide_common/include/erlide_dbglog.hrl").
6 |
7 | %% dummy i/o server to capture output from yecc and convert it to warnings/errors
8 |
9 | -export([start/0]).
10 | -export([interfaces/1]).
11 |
12 | -export([server_loop/1]).
13 |
14 | start() ->
15 | case whereis(?MODULE) of
16 | undefined ->
17 | Id = spawn(fun server/0),
18 | register(?MODULE,Id),
19 | Id;
20 | Pid ->
21 | Pid
22 | end.
23 |
24 | server() ->
25 | group_leader(self(), self()),
26 | erlang:process_flag(save_calls, 50),
27 | server_loop([]).
28 |
29 | server_loop(Msgs) ->
30 | receive
31 | {io_request, From, ReplyAs, Request} ->
32 | From ! {io_reply, ReplyAs, ok},
33 | Msg = get_msg(Request),
34 | ?MODULE:server_loop([Msg|Msgs]);
35 | {get_msgs, From} ->
36 | From ! {msgs, lists:flatten(lists:reverse(Msgs))},
37 | ?MODULE:server_loop([]);
38 | _Other ->
39 | ?MODULE:server_loop(Msgs)
40 | end.
41 |
42 | %% Return the pid of the shell process.
43 | interfaces(_User) ->
44 | [].
45 |
46 |
47 | get_msg({put_chars, io_lib, format, ["~s", [A]]}) ->
48 | [parse(A)];
49 | get_msg({put_chars, io_lib, format, _}) ->
50 | [];
51 | get_msg(_Request) ->
52 | [].
53 |
54 | -define(ERROR, 0).
55 | -define(WARNING, 1).
56 | -define(INFO, 2).
57 |
58 | parse(Str) ->
59 | T0 = string:tokens(Str, ":\n"),
60 | T = case length(hd(T0)) of
61 | 1 ->
62 | [A,B|C] = T0,
63 | [A++":"++B|C];
64 | _ ->
65 | T0
66 | end,
67 | [File, Line|Msg] = T,
68 | {list_to_integer(Line), File, string:strip(lists:flatten(Msg)), ?ERROR}.
69 |
70 |
--------------------------------------------------------------------------------
/common/apps/erlide_common/.project:
--------------------------------------------------------------------------------
1 |
2 |
3 | erlide_common
4 |
5 |
6 |
7 |
8 |
9 | org.erlide.core.erlbuilder
10 |
11 |
12 |
13 |
14 |
15 | org.erlide.core.erlnature
16 |
17 |
18 |
--------------------------------------------------------------------------------
/common/apps/erlide_common/.settings/org.eclipse.core.resources.prefs:
--------------------------------------------------------------------------------
1 | eclipse.preferences.version=1
2 | encoding/=ISO-8859-1
3 |
--------------------------------------------------------------------------------
/common/apps/erlide_common/.settings/org.erlide.core.prefs:
--------------------------------------------------------------------------------
1 | backend_version=17.0
2 | compiler/warn_deprecated_function=true
3 | compiler/warn_export_all=true
4 | compiler/warn_export_vars=true
5 | compiler/warn_obsolete_guard=true
6 | compiler/warn_shadow_vars=true
7 | compiler/warn_unused_function=true
8 | compiler/warn_unused_import=true
9 | compiler/warn_unused_record=true
10 | compiler/warn_unused_vars=true
11 | eclipse.preferences.version=1
12 | external_includes=
13 | external_modules=
14 | include_dirs=include;
15 | output_dir=ebin
16 | source_dirs=src;
17 | use_pathz=false
18 |
--------------------------------------------------------------------------------
/common/apps/erlide_common/.settings/org.erlide.model.prefs:
--------------------------------------------------------------------------------
1 | builderData=INTERNAL|compile|clean|test|
2 | configType=INTERNAL
3 | eclipse.preferences.version=1
4 |
--------------------------------------------------------------------------------
/common/apps/erlide_common/include/erlide_dbglog.hrl:
--------------------------------------------------------------------------------
1 | -define(Debug(T), erlide_log:erlangLog(?MODULE, ?LINE, finest, T)).
2 | -define(DebugStack(T), erlide_log:erlangLogStack(?MODULE, ?LINE, finest, T)).
3 | -define(Info(T), erlide_log:erlangLog(?MODULE, ?LINE, info, T)).
4 |
5 | -ifdef(DEBUG).
6 | -compile(export_all).
7 | -ifdef(IO_FORMAT_DEBUG).
8 | -define(D(T), io:format("~p\n", [{?MODULE, ?LINE, T}])).
9 | -else.
10 | -define(D(T), ?Debug(T)).
11 | -endif.
12 | -else.
13 | -define(D(T), ok).
14 | -endif.
15 |
16 |
17 |
--------------------------------------------------------------------------------
/common/apps/erlide_common/priv/.keep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erlang/erlide_kernel/ba61079066c495ad22f4da52da294cf0f97d489f/common/apps/erlide_common/priv/.keep
--------------------------------------------------------------------------------
/common/apps/erlide_common/src/erlide_common.app.src:
--------------------------------------------------------------------------------
1 | {application, erlide_common,
2 | [
3 | {description,"erlide_common"},
4 | {vsn, "0.118.0"},
5 | {erlide_context, common},
6 | {registered, []},
7 | {applications, [kernel, stdlib]},
8 | {env, []}
9 | ]}
10 | .
11 |
--------------------------------------------------------------------------------
/common/apps/erlide_common/src/erlide_common_app.erl:
--------------------------------------------------------------------------------
1 | -module(erlide_common_app).
2 |
3 | -export([
4 | init/4
5 | ]).
6 |
7 | init(JRex, Kill, HeapWarnLimit, HeapKillLimit) ->
8 | io:format("Start common app~n"),
9 | spawn(fun () ->
10 | startup(JRex, Kill, HeapWarnLimit, HeapKillLimit)
11 | end).
12 |
13 | startup(JRex, Kill, HeapWarnLimit, HeapKillLimit)->
14 | erlide_jrpc:init(JRex),
15 | watch_eclipse(node(JRex), Kill),
16 |
17 | erlide_monitor:start(HeapWarnLimit, HeapKillLimit),
18 | erlang:system_monitor(erlang:whereis(erlide_monitor),
19 | [{long_gc, 3000}, {large_heap, HeapWarnLimit*1000000 div 2}]),
20 | ok.
21 |
22 | watch_eclipse(JavaNode, Kill) ->
23 | spawn(fun() ->
24 | monitor_node(JavaNode, true),
25 | erlide_log:log({"Monitoring java node", JavaNode}),
26 | write_message({"start monitoring", JavaNode, Kill}),
27 | wait_nodedown(JavaNode, Kill)
28 | end).
29 |
30 | shutdown() ->
31 | write_message("SHUTTING DOWN"),
32 | erlide_monitor:stop(),
33 | L = [V || V = "erlide_" ++ _ <- [atom_to_list(X) || X <- registered()]],
34 | [exit(whereis(list_to_atom(X)), kill) || X <- L],
35 | write_message("FINISHED"),
36 | ok.
37 |
38 | write_message(Msg) ->
39 | {ok, [[Home]]} = init:get_argument(home),
40 | {ok, F} = file:open(Home++"/erlide_debug.txt", [append, raw]),
41 | file:write(F, io_lib:format("~p: ~p got ~p~n", [erlang:universaltime(), node(), Msg])),
42 | file:sync(F),
43 | file:close(F),
44 | ok.
45 |
46 | wait_nodedown(JavaNode, Kill) ->
47 | receive
48 | {nodedown, JavaNode}=_Msg ->
49 | write_message(_Msg),
50 | case Kill of
51 | true ->
52 | erlang:halt(abort, [{flush, false}]),
53 | ok;
54 | false ->
55 | shutdown(),
56 | ok
57 | end,
58 | ok
59 | after 5000 ->
60 | wait_nodedown(JavaNode, Kill)
61 | end.
62 |
--------------------------------------------------------------------------------
/common/apps/erlide_common/src/erlide_jrpc.erl:
--------------------------------------------------------------------------------
1 | -module(erlide_jrpc).
2 |
3 | %% The processes spawned from this module are not meant to support code reload,
4 | %% because they are crucial to the functioning of the backends and
5 | %% careless update of code could make nothing work anymore.
6 |
7 | -export([
8 | init/1,
9 | add_service/2,
10 | get_service_listeners/1,
11 | notify/2,
12 |
13 | event/2
14 | ]).
15 |
16 | -include("erlide_dbglog.hrl").
17 |
18 | -define(MANAGER, erlide_rex_manager).
19 |
20 | init(JPid) ->
21 | case whereis(?MANAGER) of
22 | undefined ->
23 | Pid = spawn(fun() ->
24 | erlang:process_flag(save_calls, 50),
25 | manager([])
26 | end),
27 | register(?MANAGER, Pid);
28 | _ ->
29 | ok
30 | end,
31 |
32 | add_service(log, JPid),
33 | add_service(erlang_log, JPid),
34 | add_service(io_server, JPid),
35 |
36 | %% catch_all handler
37 | add_service(generic_catchall, JPid),
38 |
39 | ok.
40 |
41 |
42 | event(Id, Msg) ->
43 | Self = self(),
44 | %% we can't notify asynchronously because order of messages can get wrong
45 | notify(Id, {event, Id, Msg, Self}).
46 |
47 | manager(State) ->
48 | receive
49 | {add, Service, Pid} ->
50 | Old = keytake(Service, 1, State),
51 | State2 = case Old of
52 | false ->
53 | [{Service, [Pid]}];
54 | {value, {Service, Values}, State1} ->
55 | case lists:member(Pid, Values) of
56 | true ->
57 | State;
58 | false ->
59 | [{Service, [Pid|Values]} | State1]
60 | end
61 | end,
62 | manager(State2);
63 | {get, Service, From, Ref} ->
64 | Value = case lists:keysearch(Service, 1, State) of
65 | false ->
66 | [];
67 | {value, {Service, Pids}} ->
68 | Pids
69 | end,
70 | From ! {Ref, Value},
71 | manager(State);
72 | stop ->
73 | ok;
74 | _Msg ->
75 | manager(State)
76 | end.
77 |
78 | add_service(Service, Pid) when is_atom(Service), is_pid(Pid) ->
79 | catch (?MANAGER ! {add, Service, Pid}).
80 |
81 | get_service_listeners(Service) when is_atom(Service) ->
82 | Ref = make_ref(),
83 | catch (?MANAGER ! {get, Service, self(), Ref}),
84 | receive {Ref, X} -> X end.
85 |
86 | notify(Service, Message) when is_atom(Service) ->
87 | L = case get_service_listeners(Service) of
88 | [] ->
89 | get_service_listeners(generic_catchall);
90 | L0 ->
91 | L0
92 | end,
93 | [Pid ! Message || Pid <- L],
94 | ok.
95 |
96 | keytake(Key, N, L) when is_integer(N), N > 0 ->
97 | keytake(Key, N, L, []).
98 |
99 | keytake(Key, N, [H|T], L) when element(N, H) == Key ->
100 | {value, H, lists:reverse(L, T)};
101 | keytake(Key, N, [H|T], L) ->
102 | keytake(Key, N, T, [H|L]);
103 | keytake(_K, _N, [], _L) -> false.
104 |
--------------------------------------------------------------------------------
/common/apps/erlide_common/src/erlide_log.erl:
--------------------------------------------------------------------------------
1 | %%% ******************************************************************************
2 | %%% Copyright (c) 2008 Vlad Dumitrescu and others.
3 | %%% All rights reserved. This program and the accompanying materials
4 | %%% are made available under the terms of the Eclipse Public License v1.0
5 | %%% which accompanies this distribution, and is available at
6 | %%% http://www.eclipse.org/legal/epl-v10.html
7 | %%%
8 | %%% Contributors:
9 | %%% Vlad Dumitrescu
10 | %%% ******************************************************************************/
11 | %%% File : erlide_log.erl
12 | %%% Author : Vlad Dumitrescu
13 | %%% Description :
14 |
15 | -module(erlide_log).
16 |
17 | -export([log/1, logp/1, logp/2, log/2, erlangLog/4, erlangLogStack/4]).
18 |
19 | -define(DEFAULT_LEVEL, info).
20 |
21 | log(Msg) ->
22 | log(?DEFAULT_LEVEL, Msg).
23 |
24 | logp(Msg) ->
25 | logp("~p", [Msg]).
26 |
27 | logp(Fmt, Msgs) when is_list(Fmt), is_list(Msgs) ->
28 | log(?DEFAULT_LEVEL, lists:flatten(io_lib:format(Fmt, Msgs))).
29 |
30 | log(Level, Msg) when is_atom(Level) ->
31 | erlide_jrpc:event(log, {Level, Msg}).
32 |
33 | erlangLog(Module, Line, Level, Msg) when is_atom(Level) ->
34 | erlide_jrpc:event(erlang_log, {Module, Line, Level, Msg}).
35 |
36 | erlangLogStack(Module, Line, Level, Msg) when is_atom(Level) ->
37 | erlide_jrpc:event(erlang_log, {Module, Line, Level, Msg, erlang:process_info(self(), backtrace)}).
38 |
39 |
--------------------------------------------------------------------------------
/common/apps/erlide_common/src/erlide_pool.erl:
--------------------------------------------------------------------------------
1 | %%% ******************************************************************************
2 | %%% Copyright (c) 2009 Vlad Dumitrescu and others.
3 | %%% All rights reserved. This program and the accompanying materials
4 | %%% are made available under the terms of the Eclipse Public License v1.0
5 | %%% which accompanies this distribution, and is available at
6 | %%% http://www.eclipse.org/legal/epl-v10.html
7 | %%%
8 | %%% Contributors:
9 | %%% Vlad Dumitrescu
10 | %%% ******************************************************************************/
11 | %% Author: Vlad
12 | %% Created: 7 okt 2009
13 | %% Description: A server that processes requests in a pool of worker processes.
14 | %% It's a simple implementation, do not use for large pools.
15 |
16 | -module(erlide_pool).
17 |
18 | %%
19 | %% Include files
20 | %%
21 |
22 | %%-define(DEBUG, 1).
23 |
24 | -include("erlide_dbglog.hrl").
25 |
26 | %%
27 | %% Exported Functions
28 | %%
29 | -export([
30 | start/1,
31 | start/2,
32 | call/3
33 | ]).
34 |
35 | -record(state, {queue = queue:new(), max=1, crt=0}).
36 |
37 | start(Name) when is_atom(Name) ->
38 | Max = erlang:system_info(schedulers),
39 | start(Name, Max).
40 |
41 | start(Name, {multiplier, Multi}) when is_atom(Name), is_integer(Multi), Multi > 0 ->
42 | Max = erlang:system_info(schedulers)*Multi,
43 | start(Name, Max);
44 | start(Name, Max) when is_atom(Name), is_integer(Max), Max =< 0 ->
45 | start(Name);
46 | start(Name, Max) when is_atom(Name), is_integer(Max) ->
47 | Pid = spawn(fun() ->
48 | loop(#state{max=Max})
49 | end),
50 | catch register(Name, Pid),
51 | ok.
52 |
53 | call(Name, Fun, Args) when is_atom(Name) ->
54 | Name ! {call, self(), Fun, Args},
55 | receive
56 | Result ->
57 | Result
58 | end.
59 |
60 |
61 | %%
62 | %% Local Functions
63 | %%
64 |
65 | loop(#state{}=State) ->
66 | receive
67 | done ->
68 | do_work(State);
69 | {call, _From, _Fun, _Args} = Msg ->
70 | queue_work(State, Msg);
71 | _Other ->
72 | loop(State)
73 | end.
74 |
75 | do_work(#state{queue=Queue, crt=N}=State) ->
76 | case queue:out(Queue) of
77 | {{value, {call, From, Fun, Args}}, Queue2} ->
78 | spawn_worker(From, Fun, Args),
79 | loop(State#state{queue=Queue2});
80 | _ ->
81 | loop(State#state{crt=N-1})
82 | end.
83 |
84 | queue_work(#state{queue=Queue, crt=N, max=Max}=State, {call, From, Fun, Args}=Msg) ->
85 | case N < Max of
86 | true ->
87 | spawn_worker(From, Fun, Args),
88 | loop(State#state{crt=N+1});
89 | false ->
90 | loop(State#state{queue=queue:in(Msg, Queue)})
91 | end.
92 |
93 |
94 | spawn_worker(From, Fun, Args) ->
95 | Server = self(),
96 | Pid = spawn(fun()-> worker(Server, From, Fun, Args) end),
97 | Pid.
98 |
99 | worker(Server, From, Fun, Args) ->
100 | %%erlide_log:logp("--- %%$$ CALL ~p", [hd(Args)]),
101 | Result = (catch apply(Fun, Args)),
102 | From ! Result,
103 | Server ! done,
104 | %%erlide_log:logp("--- %%$$ OK ~p", [hd(Args)]),
105 | ok.
106 |
--------------------------------------------------------------------------------
/common/apps/erlide_common/src/erlide_proclist.erl:
--------------------------------------------------------------------------------
1 | %%% ******************************************************************************
2 | %%% Copyright (c) 2004 Vlad Dumitrescu and others.
3 | %%% All rights reserved. This program and the accompanying materials
4 | %%% are made available under the terms of the Eclipse Public License v1.0
5 | %%% which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
6 | %%%
7 | %%% Contributors:
8 | %%% Vlad Dumitrescu
9 | %%% ******************************************************************************/
10 | %%% File : erlide_backend.erl
11 | %%% Author : Vlad Dumitrescu
12 | %%% Description :
13 | %%% Created : 12 Aug 2004 by Vlad Dumitrescu
14 | %%% Version: $Revision: 1.2 $
15 |
16 | -module(erlide_proclist).
17 |
18 | -export([
19 | init/1,
20 |
21 | process_list/0,
22 | process_list_init/0,
23 | get_process_info/1
24 | ]).
25 |
26 | init(_EventSinkPid) ->
27 | process_list_init(),
28 | ok.
29 |
30 | %% taken from distel, for testing
31 | %% original author: Luke Gorrie
32 |
33 | process_list() ->
34 | [info(Pid) || Pid <- processes()].
35 |
36 | info(Pid) ->
37 | {Pid,
38 | name(Pid),
39 | initial_call(Pid),
40 | reductions(Pid),
41 | messages(Pid)
42 | }.
43 |
44 | name(Pid) ->
45 | case process_info(Pid, registered_name) of
46 | {registered_name, Regname} ->
47 | Regname;
48 | _ ->
49 | lists:flatten(io_lib:format("~p", [Pid]))
50 | end.
51 |
52 | initial_call(Pid) ->
53 | case process_info(Pid, initial_call) of
54 | {initial_call, {M, F, A}} ->
55 | lists:flatten(io_lib:format("~s:~s/~p", [M, F, A]));
56 | Other ->
57 | lists:flatten(io_lib:format("~p", [Other]))
58 | end.
59 |
60 | reductions(Pid) ->
61 | {reductions, NrReds} = process_info(Pid, reductions),
62 | NrReds.
63 |
64 | messages(Pid) ->
65 | {message_queue_len, Len} = process_info(Pid, message_queue_len),
66 | Len.
67 |
68 | get_process_info(Pid) ->
69 | case (catch erlang:process_info(Pid)) of
70 | {'EXIT', Reason} ->
71 | {error, Reason};
72 | Result ->
73 | Result
74 | end.
75 |
76 | process_list_init() ->
77 | case get(process_list_init) of
78 | true ->
79 | ok;
80 | _ ->
81 | put(process_list_init, true),
82 | spawn(fun() ->
83 | process_list_updater()
84 | end)
85 | end.
86 |
87 | process_list_updater() ->
88 | receive
89 | stop -> ok;
90 | _ -> process_list_updater()
91 | after 5000 ->
92 | erlide_jrpc:event(processlist, {erlang:timestamp(), self()}),
93 | process_list_updater()
94 | end.
95 |
96 |
97 | %% end distel
98 |
99 |
--------------------------------------------------------------------------------
/common/apps/erlide_common/src/erlide_util.erl:
--------------------------------------------------------------------------------
1 | %% Author: jakob
2 | %% Created: 25 okt 2007
3 | -module(erlide_util).
4 |
5 | %% -define(DEBUG, 1).
6 |
7 | %%
8 | %% Include files
9 | %%
10 |
11 | -include("erlide_dbglog.hrl").
12 |
13 | %%
14 | %% Exported Functions
15 | %%
16 | -export([pack/1, unpack/1, join/2]).
17 | -export([load/2]).
18 | -export([reverse2/1]).
19 | -export([get_between_strs/3, get_all_between_strs/3, get_from_str/2,
20 | get_upto_str/2 ,split_lines/1]).
21 | -export([get_auto_imported/1, add_auto_imported/1]).
22 |
23 | %%
24 | %% API Functions
25 | %%
26 |
27 | load(Mod, All) ->
28 | case code:is_sticky(Mod) of
29 | true ->
30 | ok;
31 | false ->
32 | if All ->
33 | c:nl(Mod);
34 | true ->
35 | c:l(Mod)
36 | end
37 | end.
38 |
39 | -define(SEP, ";").
40 |
41 | unpack(F) ->
42 | string:tokens(F, ?SEP).
43 |
44 | pack(L) ->
45 | join(L, ?SEP).
46 |
47 | reverse2(L) when is_list(L) ->
48 | lists:reverse([lists:reverse(A) || A <- L]).
49 |
50 | get_from_str(Text, Start) ->
51 | case string:str(Text, Start) of
52 | 0 ->
53 | Text;
54 | N ->
55 | string:substr(Text, N + length(Start))
56 | end.
57 |
58 | get_between_strs(Text, Start, End) ->
59 | get_upto_str(get_from_str(Text, Start), End).
60 |
61 | get_all_between_strs(Text, Start, End) ->
62 | {One, Next} = split_at(get_from_str(Text, Start), End),
63 | case Next of
64 | "" ->
65 | [One];
66 | _ ->
67 | [One | get_all_between_strs(Next, Start, End)]
68 | end.
69 |
70 | get_upto_str(Text, End) ->
71 | case string:rstr(Text, End) of
72 | 0 ->
73 | Text;
74 | N ->
75 | string:substr(Text, 1, N-1)
76 | end.
77 |
78 | split_at(Text, End) ->
79 | case string:str(Text, End) of
80 | 0 ->
81 | {Text, ""};
82 | N ->
83 | {string:substr(Text, 1, N-1), string:substr(Text, N+length(End))}
84 | end.
85 |
86 | split_lines(<>) ->
87 | split_lines(binary_to_list(B));
88 | split_lines(L) when is_list(L) ->
89 | split_lines(L, [], []).
90 |
91 | split_lines([], [], Acc) ->
92 | lists:reverse(Acc);
93 | split_lines([], LineAcc, Acc) ->
94 | split_lines([], [], [lists:reverse(LineAcc) | Acc]);
95 | split_lines([$\r, $\n | Rest], LineAcc, Acc) ->
96 | split_lines(Rest, [], [lists:reverse(LineAcc) | Acc]);
97 | split_lines([$\n | Rest], LineAcc, Acc) ->
98 | split_lines(Rest, [], [lists:reverse(LineAcc) | Acc]);
99 | split_lines([$\r | Rest], LineAcc, Acc) ->
100 | split_lines(Rest, [], [lists:reverse(LineAcc) | Acc]);
101 | split_lines([C | Rest], LineAcc, Acc) ->
102 | split_lines(Rest, [C | LineAcc], Acc).
103 |
104 | join([], Sep) when is_list(Sep) ->
105 | [];
106 | join([H|T], Sep) ->
107 | H ++ lists:append([Sep ++ X || X <- T]).
108 |
109 | add_auto_imported(Imports) ->
110 | [{erlang, get_auto_imported("")} | Imports].
111 |
112 | get_auto_imported(Prefix) when is_list(Prefix) ->
113 | case catch erlang:module_info(exports) of
114 | Val when is_list(Val) ->
115 | lists:filter(fun({N, A}) ->
116 | lists:prefix(Prefix, atom_to_list(N)) andalso
117 | erl_internal:bif(N, A)
118 | end, Val);
119 | _Error ->
120 | ?D(_Error),
121 | error
122 | end.
123 |
124 | %%
125 | %% Local Functions
126 | %%
127 |
128 |
--------------------------------------------------------------------------------
/common/apps/erlide_common/test/erlide_util_tests.erl:
--------------------------------------------------------------------------------
1 | -module(erlide_util_tests).
2 |
3 | -include_lib("eunit/include/eunit.hrl").
4 |
5 | reverse_test_() ->
6 | [
7 | ?_assertEqual([[3,2,1],[a,b,c]], erlide_util:reverse2([[c,b,a],[1,2,3]]))
8 | ].
9 |
10 | pack_test_() ->
11 | [
12 | ?_assertEqual(["aa","bb","cc"],
13 | erlide_util:unpack("aa;bb;cc")),
14 | ?_assertEqual("aa;bb;cc",
15 | erlide_util:pack(["aa","bb","cc"]))
16 | ].
17 |
18 | string_test_() ->
19 | [
20 | ?_assertEqual("ty",
21 | erlide_util:get_from_str("Texty", "ex")),
22 | ?_assertEqual(" Super ",
23 | erlide_util:get_between_strs("More Super Help", "re", "He")),
24 | ?_assertEqual([" Super ", "x mon", "s"],
25 | erlide_util:get_all_between_strs("More Super Helprex monHes", "re", "He"))
26 | ].
27 |
28 | split_lines_test_() ->
29 | [
30 | ?_assertEqual(["ab"],
31 | erlide_util:split_lines("ab")),
32 | ?_assertEqual(["ab"],
33 | erlide_util:split_lines("ab\n")),
34 | ?_assertEqual(["ab", "cd"],
35 | erlide_util:split_lines("ab\ncd")),
36 | ?_assertEqual(["ab", "cd"],
37 | erlide_util:split_lines("ab\r\ncd")),
38 | ?_assertEqual(["ab", "cd","ef","gh", "", "hi"],
39 | erlide_util:split_lines("ab\ncd\ref\r\ngh\n\nhi")),
40 | ?_assertEqual([],
41 | erlide_util:split_lines(""))
42 | ].
--------------------------------------------------------------------------------
/common/apps/erlide_tools/.project:
--------------------------------------------------------------------------------
1 |
2 |
3 | erlide_tools
4 |
5 |
6 | erlide_common
7 |
8 |
9 |
10 | org.erlide.core.erlbuilder
11 |
12 |
13 |
14 |
15 |
16 | org.erlide.core.erlnature
17 |
18 |
19 |
--------------------------------------------------------------------------------
/common/apps/erlide_tools/.settings/org.eclipse.core.resources.prefs:
--------------------------------------------------------------------------------
1 | eclipse.preferences.version=1
2 | encoding/=ISO-8859-1
3 |
--------------------------------------------------------------------------------
/common/apps/erlide_tools/.settings/org.erlide.core.prefs:
--------------------------------------------------------------------------------
1 | backend_version=17.0
2 | compiler/warn_deprecated_function=true
3 | compiler/warn_export_all=true
4 | compiler/warn_export_vars=true
5 | compiler/warn_obsolete_guard=true
6 | compiler/warn_shadow_vars=true
7 | compiler/warn_unused_function=true
8 | compiler/warn_unused_import=true
9 | compiler/warn_unused_record=true
10 | compiler/warn_unused_vars=true
11 | eclipse.preferences.version=1
12 | external_includes=
13 | external_modules=
14 | include_dirs=include;
15 | output_dir=ebin
16 | source_dirs=src;
17 | use_pathz=false
18 |
--------------------------------------------------------------------------------
/common/apps/erlide_tools/.settings/org.erlide.model.prefs:
--------------------------------------------------------------------------------
1 | builderData=INTERNAL|compile|clean|test|
2 | configType=INTERNAL
3 | eclipse.preferences.version=1
4 |
--------------------------------------------------------------------------------
/common/apps/erlide_tools/include/.keep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erlang/erlide_kernel/ba61079066c495ad22f4da52da294cf0f97d489f/common/apps/erlide_tools/include/.keep
--------------------------------------------------------------------------------
/common/apps/erlide_tools/include/erlide_dbglog.hrl:
--------------------------------------------------------------------------------
1 | -define(Debug(T), erlide_log:erlangLog(?MODULE, ?LINE, finest, T)).
2 | -define(DebugStack(T), erlide_log:erlangLogStack(?MODULE, ?LINE, finest, T)).
3 | -define(Info(T), erlide_log:erlangLog(?MODULE, ?LINE, info, T)).
4 |
5 | -ifdef(DEBUG).
6 | -compile(export_all).
7 | -ifdef(IO_FORMAT_DEBUG).
8 | -define(D(T), io:format("~p\n", [{?MODULE, ?LINE, T}])).
9 | -else.
10 | -define(D(T), ?Debug(T)).
11 | -endif.
12 | -else.
13 | -define(D(T), ok).
14 | -endif.
15 |
16 |
17 |
--------------------------------------------------------------------------------
/common/apps/erlide_tools/priv/.keep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erlang/erlide_kernel/ba61079066c495ad22f4da52da294cf0f97d489f/common/apps/erlide_tools/priv/.keep
--------------------------------------------------------------------------------
/common/apps/erlide_tools/src/erlide_dialyze.erl:
--------------------------------------------------------------------------------
1 | %% Author: jakob
2 | %% Created: 17 feb 2010
3 | -module(erlide_dialyze).
4 |
5 | %%
6 | %% Include files
7 | %%
8 |
9 | %% -define(DEBUG, 1).
10 |
11 | -include("erlide_dbglog.hrl").
12 | -include_lib("kernel/include/file.hrl").
13 |
14 | %%
15 | %% Exported Functions
16 | %%
17 | -export([dialyze/5,
18 | format_warnings/1,
19 | check_plt/1]).
20 |
21 | %%
22 | %% API Functions
23 | %%
24 |
25 | dialyze(Files, PltFiles, Includes, FromSource, NoCheckPLT) ->
26 | From = case FromSource of
27 | true -> src_code;
28 | false -> byte_code
29 | end,
30 | R = (catch dialyzer:run([{files, Files},
31 | {plts, PltFiles},
32 | {from, From},
33 | {include_dirs, Includes},
34 | {analysis_type, 'succ_typings'},
35 | {check_plt, not NoCheckPLT}])),
36 | case R of
37 | {ErrorOrExit, E} when ErrorOrExit =:= 'EXIT'; ErrorOrExit =:= dialyzer_error ->
38 | {dialyzer_error, flat(E)};
39 | Result ->
40 | {warnings, Result}
41 | end.
42 |
43 | format_warnings(Warnings) ->
44 | [ dialyzer:format_warning(W) || W <- Warnings].
45 |
46 | check_plt(Plt) ->
47 | dialyzer:run([{analysis_type, plt_check},
48 | {init_plt, Plt}]).
49 |
50 | %%
51 | %% Local Functions
52 | %%
53 |
54 | flat({{dialyzer_error, E}, _}) ->
55 | flat(E);
56 | flat({dialyzer_error, E}) ->
57 | flat(E);
58 | flat(L) ->
59 | lists:flatten(L).
60 |
--------------------------------------------------------------------------------
/common/apps/erlide_tools/src/erlide_eunit_listener.erl:
--------------------------------------------------------------------------------
1 | -module(erlide_eunit_listener).
2 |
3 | -behaviour(eunit_listener).
4 |
5 | -export([start/1]).
6 |
7 | -export([init/1, handle_begin/3, handle_end/3, handle_cancel/3,
8 | terminate/2]).
9 |
10 | start(Options) ->
11 | eunit_listener:start(?MODULE, Options).
12 |
13 | init(Options) ->
14 | erlide_jrpc:event(eunit, {init, Options}),
15 | ok.
16 |
17 | terminate({ok, Data}, _St) ->
18 | erlide_jrpc:event(eunit, {terminated, Data}),
19 | ok;
20 | terminate({error, Reason}, _St) ->
21 | erlide_jrpc:event(eunit, {crashed, Reason}),
22 | sync_end(error).
23 |
24 | sync_end(Result) ->
25 | receive
26 | {stop, Reference, ReplyTo} ->
27 | ReplyTo ! {result, Reference, Result},
28 | ok
29 | end.
30 |
31 | handle_begin(group, Data, _St) ->
32 | erlide_jrpc:event(eunit, {begin_group, Data}),
33 | ok;
34 | handle_begin(test, Data, _St) ->
35 | erlide_jrpc:event(eunit, {begin_test, Data}),
36 | ok.
37 |
38 | handle_end(group, Data, _St) ->
39 | erlide_jrpc:event(eunit, {end_group, Data}),
40 | ok;
41 | handle_end(test, Data, _St) ->
42 | erlide_jrpc:event(eunit, {end_test, Data}),
43 | ok.
44 |
45 | handle_cancel(group, Data, _St) ->
46 | erlide_jrpc:event(eunit, {cancel_group, Data}),
47 | ok;
48 | handle_cancel(test, Data, _St) ->
49 | erlide_jrpc:event(eunit, {cancel_test, Data}),
50 | ok.
51 |
--------------------------------------------------------------------------------
/common/apps/erlide_tools/src/erlide_tools.app.src:
--------------------------------------------------------------------------------
1 | {application, erlide_tools,
2 | [
3 | {description,"erlide_tools"},
4 | {vsn, "0.118.0"},
5 | {erlide_context, common},
6 | {registered, []},
7 | {applications, [kernel, stdlib, erlide_common]},
8 | {env, []}
9 | ]}
10 | .
11 |
--------------------------------------------------------------------------------
/common/apps/erlide_tools/src/erlide_tools_app.erl:
--------------------------------------------------------------------------------
1 | -module(erlide_tools_app).
2 |
3 | -export([
4 | init/0
5 | ]).
6 |
7 | init() ->
8 | io:format("Start tools app~n"),
9 | ok.
10 |
11 |
--------------------------------------------------------------------------------
/common/apps/erlide_tools/src/observer_backend.hrl:
--------------------------------------------------------------------------------
1 | %% ``The contents of this file are subject to the Erlang Public License,
2 | %% Version 1.1, (the "License"); you may not use this file except in
3 | %% compliance with the License. You should have received a copy of the
4 | %% Erlang Public License along with this software. If not, it can be
5 | %% retrieved via the world wide web at http://www.erlang.org/.
6 | %%
7 | %% Software distributed under the License is distributed on an "AS IS"
8 | %% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
9 | %% the License for the specific language governing rights and limitations
10 | %% under the License.
11 | %%
12 | %% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
13 | %% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
14 | %% AB. All Rights Reserved.''
15 | %%
16 | %% $Id$
17 | %%
18 |
19 | -record(etop_info,
20 | {now = {0, 0, 0},
21 | n_procs = 0,
22 | wall_clock = {0, 0},
23 | runtime = {0, 0},
24 | run_queue = 0,
25 | alloc_areas = [],
26 | memi = [{total, 0},
27 | {processes, 0},
28 | {ets, 0},
29 | {atom, 0},
30 | {code, 0},
31 | {binary, 0}],
32 | procinfo = []
33 | }).
34 |
35 | -record(etop_proc_info,
36 | {pid,
37 | mem=0,
38 | reds=0,
39 | name,
40 | runtime=0,
41 | cf,
42 | mq=0}).
43 |
--------------------------------------------------------------------------------
/common/apps/erlide_tools/src/proc_list.erl:
--------------------------------------------------------------------------------
1 | %% Author: piotr.dorobisz
2 | %% Created: Sep 14, 2010
3 | -module(proc_list).
4 |
5 | %%
6 | %% Exported Functions
7 | %%
8 | -export([list_all_processes/1]).
9 |
10 | list_all_processes(Nodes) ->
11 | list_all_processes(Nodes, []).
12 |
13 | list_all_processes([H|T], Acc) ->
14 | case rpc:call(H, erlang, processes, []) of
15 | {badrpc, nodedown} ->
16 | list_all_processes(T, Acc);
17 | Processes ->
18 | List = [{Pid, name(H, Pid), initial_call(H, Pid), H} || Pid <- Processes],
19 | list_all_processes(T, lists:append(Acc, List))
20 | end;
21 | list_all_processes([], Acc) ->
22 | Acc.
23 |
24 | name(Node, Pid) ->
25 | case rpc:call(Node, erlang, process_info, [Pid, registered_name]) of
26 | {registered_name, Regname} ->
27 | Regname;
28 | _ ->
29 | lists:flatten(io_lib:format("~p", [Pid]))
30 | end.
31 |
32 | initial_call(Node, Pid) ->
33 | case rpc:call(Node, erlang, process_info, [Pid, initial_call]) of
34 | {initial_call, {M, F, A}} ->
35 | lists:flatten(io_lib:format("~s:~s/~p", [M, F, A]));
36 | _ ->
37 | "unknown"
38 | end.
39 |
--------------------------------------------------------------------------------
/common/apps/erlide_tools/src/runtime_tools_sup.erl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erlang/erlide_kernel/ba61079066c495ad22f4da52da294cf0f97d489f/common/apps/erlide_tools/src/runtime_tools_sup.erl
--------------------------------------------------------------------------------
/common/apps/erlide_tools/src/ttb_autostart.erl:
--------------------------------------------------------------------------------
1 | %%%-------------------------------------------------------------------
2 | %%% File : ttb_autostart.erl
3 | %%% Author : Bartłomiej Puzoń
4 | %%% Description : This supervisor is used to resume ttb tracing
5 | %%% Users are able to provide custom restart modules for *_config, as
6 | %%% file:write/read/delete may not be possible on diskless nodes.
7 | %%%
8 | %%% Created : 31 Jul 2010 by
9 | %%%-------------------------------------------------------------------
10 | -module(ttb_autostart).
11 |
12 | -behaviour(gen_server).
13 |
14 | %% API
15 | -export([start_link/0,
16 | read_config/0,
17 | write_config/1,
18 | delete_config/0]).
19 |
20 | %% gen_server callbacks
21 | -export([init/1, handle_call/3, handle_cast/2, handle_info/2,
22 | terminate/2, code_change/3]).
23 |
24 | -define(DEF_AUTOSTART_MODULE, ?MODULE).
25 | -define(AUTOSTART_FILENAME, "ttb_autostart.bin").
26 |
27 | start_link() ->
28 | gen_server:start_link(?MODULE, no_args, []).
29 |
30 | delete_config() ->
31 | file:delete(?AUTOSTART_FILENAME).
32 |
33 | read_config() ->
34 | case file:read_file(?AUTOSTART_FILENAME) of
35 | {ok, Data} -> {ok, binary_to_term(Data)};
36 | Error -> Error
37 | end.
38 |
39 | write_config(Data) ->
40 | file:write_file(?AUTOSTART_FILENAME, term_to_binary(Data)).
41 |
42 | init(no_args) ->
43 | case application:get_env(runtime_tools, ttb_autostart_module) of
44 | {ok, _} -> ok;
45 | undefined -> application:set_env(runtime_tools, ttb_autostart_module, ?DEF_AUTOSTART_MODULE)
46 | end,
47 | observer_backend:ttb_resume_trace(),
48 | %%As the process is not needed any more, it will shut itself down
49 | {ok, no_args, 10000}.
50 |
51 | handle_call(_,_,_) -> {noreply, no_args}.
52 | handle_cast(_,_) -> {noreply, no_args}.
53 | handle_info(timeout,_) -> {stop, normal, no_args}.
54 | terminate(_,_) -> ok.
55 | code_change(_,_,_) -> {ok, no_args}.
56 |
57 |
--------------------------------------------------------------------------------
/common/apps/erlide_tools/src/ttb_integration.erl:
--------------------------------------------------------------------------------
1 | %% Author: Piotr Dorobisz
2 | %% Created: Jul 29, 2010
3 | -module(ttb_integration).
4 |
5 | %%
6 | %% Exported Functions
7 | %%
8 | -export([start/3, stop/0, load/3, load_data/3, get_file_info/1, str2ms/1]).
9 |
10 |
11 | start(NodesAndCookies, FileName, NetTicktime)->
12 | ttbe:stop(),
13 | net_kernel:set_net_ticktime(NetTicktime),
14 | Nodes = set_cookies(NodesAndCookies),
15 | ttbe:tracer(Nodes, [{file,{local, FileName}}]).
16 |
17 | set_cookies(NodesAndCookies) ->
18 | F = fun({Node, Cookie}) ->
19 | case Cookie of
20 | '' ->
21 | ok;
22 | _ ->
23 | erlang:set_cookie(Node, Cookie)
24 | end,
25 | Node
26 | end,
27 | lists:map(F, NodesAndCookies).
28 |
29 | stop() ->
30 | {stopped, Dir} = ttbe:stop([return]),
31 | spawn(?MODULE, get_file_info, [Dir]).
32 |
33 | get_file_info(Path) ->
34 | Result = (catch ttbe:format(Path, [{handler, {create_info_handler(Path), {true, 0, '_', '_'}}}])),
35 | case Result of
36 | ok -> erlide_jrpc:event(trace_event, stop_tracing);
37 | {error, Reason} -> erlide_jrpc:event(trace_event, {error_loading, Reason});
38 | _ -> erlide_jrpc:event(trace_event, {error_loading, "Can not load data"})
39 | end.
40 |
41 | load(Path, Start, Stop) ->
42 | spawn(?MODULE, load_data, [Path, Start, Stop]).
43 |
44 | load_data(Path, Start, Stop) ->
45 | Result = (catch ttbe:format(Path, [{handler, {create_load_handler(Start, Stop), 1}}])),
46 | case Result of
47 | ok -> erlide_jrpc:event(trace_event, stop_tracing);
48 | {error, Reason} -> erlide_jrpc:event(trace_event, {error_loading, Reason});
49 | _ -> erlide_jrpc:event(trace_event, {error_loading, "Can not load data"})
50 | end.
51 |
52 | create_load_handler(Start, Stop) ->
53 | fun(_Fd, Trace, _TraceInfo, State) ->
54 | if
55 | State >= Start, State =< Stop ->
56 | case Trace of
57 | {trace_ts, Pid, call, {Mod, Fun, Args}, Time} ->
58 | erlide_jrpc:event(trace_event, {trace_ts, Pid, call, {Mod, Fun,[avoid_interpreting_as_string] ++ Args}, calendar:now_to_local_time(Time)});
59 | {trace_ts, Pid, spawn, Pid2, {M, F, Args}, Time} ->
60 | erlide_jrpc:event(trace_event, {trace_ts, Pid, spawn, Pid2, {M, F, [avoid_interpreting_as_string] ++ Args}, calendar:now_to_local_time(Time)});
61 | {trace_ts, _, _, _, Time} ->
62 | T = calendar:now_to_local_time(Time),
63 | erlide_jrpc:event(trace_event, setelement(tuple_size(Trace), Trace, T));
64 | {trace_ts, _, _, _, _, Time} ->
65 | T = calendar:now_to_local_time(Time),
66 | erlide_jrpc:event(trace_event, setelement(tuple_size(Trace), Trace, T));
67 | _ ->
68 | erlide_jrpc:event(trace_event, Trace)
69 | end;
70 | true -> ok
71 | end,
72 | State + 1
73 | end.
74 |
75 | create_info_handler(Path) ->
76 | fun(_Fd, Trace, _TraceInfo, State) ->
77 | {First, Count, Start_date, End_date} = State,
78 | case Trace of
79 | end_of_trace ->
80 | case First of
81 | true ->
82 | erlide_jrpc:event(trace_event, {file_info, empty});
83 | false ->
84 | erlide_jrpc:event(trace_event, {file_info, calendar:now_to_local_time(Start_date), calendar:now_to_local_time(End_date), Path, Count})
85 | end;
86 | {trace_ts, _, _, _, Time} ->
87 | case First of
88 | true -> {false, Count + 1, Time, Time};
89 | _ -> {false, Count + 1, Start_date, Time}
90 | end;
91 | {trace_ts, _, _, _, _, Time} ->
92 | case First of
93 | true -> {false, Count + 1, Time, Time};
94 | _ -> {false, Count + 1, Start_date, Time}
95 | end;
96 | _ -> {First, Count + 1, Start_date, End_date}
97 | end
98 | end.
99 |
100 | str2fun(S) ->
101 | case erl_scan:string(S) of
102 | {error, ErrorInfo, _} ->
103 | {error, ErrorInfo};
104 | {ok, Tokens, _} ->
105 | case erl_parse:parse_exprs(Tokens) of
106 | {error, ErrorInfo} ->
107 | {error, ErrorInfo};
108 | {ok, Expr_list} ->
109 | {value, Value, _} = erl_eval:exprs(Expr_list, erl_eval:new_bindings()),
110 | {ok, Value}
111 | end
112 | end.
113 |
114 | str2ms(S) ->
115 | try (str2fun(S)) of
116 | {error, ErrorInfo} ->
117 | {error, standard_info, ErrorInfo};
118 | {ok, Fun} ->
119 | try dbg:fun2ms(Fun) of
120 | {error, ErrorInfo} -> {error, standard_info, ErrorInfo};
121 | Result -> {ok, Result}
122 | catch error:function_clause -> {error, not_fun} end
123 | catch
124 | error:{unbound_var, X} -> {error, unbound_var, X}
125 | end.
126 |
--------------------------------------------------------------------------------
/common/build:
--------------------------------------------------------------------------------
1 | #! /bin/bash -e
2 |
3 | source ../build_utils.sh
4 |
5 | dir=`pwd`
6 | prj=`basename $dir`
7 |
8 | build_project ../rebar3 $prj 25 "$@"
9 |
--------------------------------------------------------------------------------
/common/rebar.config:
--------------------------------------------------------------------------------
1 | {require_otp_vsn, "25.*"}.
2 |
3 | {plugins, [
4 | covertool
5 | ]}.
6 |
7 | {deps, [
8 | ]}.
9 |
10 | {erl_opts, [
11 | warn_deprecated_function,
12 | warn_export_all,
13 | warn_export_vars,
14 | warn_obsolete_guard,
15 | warn_shadow_vars,
16 | warn_unused_function,
17 | warn_unused_import,
18 | warn_unused_record,
19 | warn_unused_vars,
20 |
21 | warnings_as_errors
22 | ]}.
23 | {edoc_opts,[{todo,true}]}.
24 |
25 | {eunit_opts, [
26 | verbose,
27 | %nowarn_missing_spec,
28 | nowarnings_as_errors,
29 | {report,{eunit_surefire,[{dir,"."}]}}
30 | ]}.
31 | {eunit_compile_opts, [
32 | nowarn_missing_spec
33 | ]}.
34 |
35 | {xref_warnings, true}.
36 | {xref_checks, [
37 | undefined_function_calls,
38 | undefined_functions,
39 | locals_not_used,
40 | % exports_not_used,
41 | deprecated_function_calls,
42 | deprecated_functions
43 | ]}.
44 |
45 | {dialyzer,
46 | [
47 | %% Store PLT locally inside the project in .rebar (Default)
48 | %% {plt_location, local},
49 | %% Store PLT in custom directory
50 | %% {plt_location, "custom_dir"},
51 | {warnings, [unmatched_returns, error_handling, unknown]},
52 | {base_plt_apps, [erts, compiler, runtime_tools, dialyzer, observer, eunit]}
53 | ]}.
54 |
55 | {cover_export_enabled, true}.
56 | {cover_enabled, true}.
57 | {cover_print_enable, true}.
58 |
59 | {covertool_eunit, {"_build/test/cover/eunit.coverdata", "eunit.coverage.xml"}}.
60 | {covertool_prefix_len, 0}.
61 |
62 | {xref_checks,[
63 | undefined_function_calls,
64 | undefined_functions,
65 | locals_not_used,
66 | %exports_not_used,
67 | deprecated_function_calls,
68 | deprecated_functions
69 | ]}.
70 |
--------------------------------------------------------------------------------
/common/rebar.lock:
--------------------------------------------------------------------------------
1 | [].
2 |
--------------------------------------------------------------------------------
/debugger/build:
--------------------------------------------------------------------------------
1 | #! /bin/bash -e
2 |
3 | cd erlide_debugger_25
4 | ./build "$@"
5 | cd ../erlide_debugger_26
6 | ./build "$@"
7 | cd ../erlide_debugger_27
8 | ./build "$@"
9 | cd ../erlide_debugger
10 | ./build "$@"
11 |
12 | cd ..
13 |
--------------------------------------------------------------------------------
/debugger/erlide_debugger/.project:
--------------------------------------------------------------------------------
1 |
2 |
3 | erlide_debugger
4 |
5 |
6 | erlide_common
7 |
8 |
9 |
10 | org.erlide.core.erlbuilder
11 |
12 |
13 |
14 |
15 |
16 | org.erlide.core.erlnature
17 |
18 |
19 |
--------------------------------------------------------------------------------
/debugger/erlide_debugger/.settings/org.eclipse.core.resources.prefs:
--------------------------------------------------------------------------------
1 | eclipse.preferences.version=1
2 | encoding/=ISO-8859-1
3 |
--------------------------------------------------------------------------------
/debugger/erlide_debugger/.settings/org.erlide.core.prefs:
--------------------------------------------------------------------------------
1 | backend_version=17.0
2 | compiler/warn_deprecated_function=true
3 | compiler/warn_export_all=true
4 | compiler/warn_export_vars=true
5 | compiler/warn_obsolete_guard=true
6 | compiler/warn_shadow_vars=true
7 | compiler/warn_unused_function=true
8 | compiler/warn_unused_import=true
9 | compiler/warn_unused_record=true
10 | compiler/warn_unused_vars=true
11 | eclipse.preferences.version=1
12 | external_includes=
13 | external_modules=
14 | include_dirs=include;
15 | output_dir=ebin
16 | source_dirs=src;
17 | use_pathz=false
18 |
--------------------------------------------------------------------------------
/debugger/erlide_debugger/.settings/org.erlide.model.prefs:
--------------------------------------------------------------------------------
1 | builderData=INTERNAL|compile|clean|test|
2 | configType=INTERNAL
3 | eclipse.preferences.version=1
4 |
--------------------------------------------------------------------------------
/debugger/erlide_debugger/build:
--------------------------------------------------------------------------------
1 | #! /bin/bash
2 |
3 | source ../../build_utils.sh
4 |
5 | dir=`pwd`
6 | prj=`basename $dir`
7 |
8 | build_project ../../rebar3 $prj 25 do clean,compile
9 |
--------------------------------------------------------------------------------
/debugger/erlide_debugger/include/.keep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erlang/erlide_kernel/ba61079066c495ad22f4da52da294cf0f97d489f/debugger/erlide_debugger/include/.keep
--------------------------------------------------------------------------------
/debugger/erlide_debugger/include/erlide_dbglog.hrl:
--------------------------------------------------------------------------------
1 | -define(Debug(T), erlide_log:erlangLog(?MODULE, ?LINE, finest, T)).
2 | -define(DebugStack(T), erlide_log:erlangLogStack(?MODULE, ?LINE, finest, T)).
3 | -define(Info(T), erlide_log:erlangLog(?MODULE, ?LINE, info, T)).
4 |
5 | -ifdef(DEBUG).
6 | -compile(export_all).
7 | -ifdef(IO_FORMAT_DEBUG).
8 | -define(D(T), io:format("~p\n", [{?MODULE, ?LINE, T}])).
9 | -else.
10 | -define(D(T), ?Debug(T)).
11 | -endif.
12 | -else.
13 | -define(D(T), ok).
14 | -endif.
15 |
16 |
17 |
--------------------------------------------------------------------------------
/debugger/erlide_debugger/priv/.keep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erlang/erlide_kernel/ba61079066c495ad22f4da52da294cf0f97d489f/debugger/erlide_debugger/priv/.keep
--------------------------------------------------------------------------------
/debugger/erlide_debugger/rebar.config:
--------------------------------------------------------------------------------
1 | {require_otp_vsn, "25.*"}.
2 |
3 | {plugins, [
4 | {rebar_localdep, {git, "https://github.com/alinpopa/rebar3-localdep-plugin.git", {branch, "master"}}}
5 | ]}.
6 |
7 | {deps, [
8 | {erlide_common, {localdep, "common/apps/erlide_common"}},
9 | {erlide_debugger_25, {localdep, "debugger/erlide_debugger_25"}}
10 | ]}.
11 |
12 |
13 | {erl_opts, [
14 | warn_deprecated_function,
15 | warn_export_all,
16 | warn_export_vars,
17 | warn_obsolete_guard,
18 | warn_shadow_vars,
19 | warn_unused_function,
20 | warn_unused_import,
21 | warn_unused_record,
22 | warn_unused_vars,
23 |
24 | warnings_as_errors
25 | ]}.
26 | {edoc_opts,[{todo,true}]}.
27 |
28 | {eunit_opts, [
29 | verbose,
30 | %nowarn_missing_spec,
31 | nowarnings_as_errors,
32 | {report,{eunit_surefire,[{dir,"."}]}}
33 | ]}.
34 | {eunit_compile_opts, [
35 | nowarn_missing_spec
36 | ]}.
37 |
38 | {xref_warnings, true}.
39 | {xref_checks, [
40 | undefined_function_calls,
41 | undefined_functions,
42 | locals_not_used,
43 | % exports_not_used,
44 | deprecated_function_calls,
45 | deprecated_functions
46 | ]}.
47 |
48 | {dialyzer,
49 | [
50 | %% Store PLT locally inside the project in .rebar (Default)
51 | %% {plt_location, local},
52 | %% Store PLT in custom directory
53 | %% {plt_location, "custom_dir"},
54 | {warnings, [unmatched_returns, error_handling, unknown]}
55 | ]}.
56 |
57 | {cover_export_enabled, true}.
58 | {cover_enabled, true}.
59 | {cover_print_enable, true}.
60 |
61 | {covertool_eunit, {"_build/test/cover/eunit.coverdata", "eunit.coverage.xml"}}.
62 | {covertool_prefix_len, 0}.
63 |
64 | {xref_checks,[
65 | undefined_function_calls,
66 | undefined_functions,
67 | locals_not_used,
68 | %exports_not_used,
69 | deprecated_function_calls,
70 | deprecated_functions
71 | ]}.
72 |
--------------------------------------------------------------------------------
/debugger/erlide_debugger/rebar.lock:
--------------------------------------------------------------------------------
1 | [{<<"erlide_common">>,{localdep,"common/apps/erlide_common"},0},
2 | {<<"erlide_debugger_25">>,{localdep,"debugger/erlide_debugger_25"},0}].
3 |
--------------------------------------------------------------------------------
/debugger/erlide_debugger/src/coverage.hrl:
--------------------------------------------------------------------------------
1 | %% Author: Aleksandra Lipiec
2 | %% Created: 22-12-2010
3 | %% Description: definitions and constants
4 | %%----------------------------------------------
5 |
6 | -define(EVENT, cover_event).
7 | -define(FINISHED, cover_fin).
8 | -define(COVER_DIR, "cover_report").
9 | -define(NO_FILE, nofile).
10 | -define(INDEX, index).
11 |
12 | %state
13 | -record(state, {cover_type,
14 | includes = [],
15 | report_dir}).
16 |
17 | %results per module
18 | -record(module_res, {name,
19 | name_html,
20 | line_num,
21 | covered_num,
22 | percentage,
23 | lines = [],
24 | functions = []}).
25 |
26 | %results per unit (module, function)
27 | -record(unit_res, {name,
28 | arity,
29 | total_l,
30 | covered_l,
31 | percentage}).
32 |
33 | %results: lines
34 | -record(line_res, {num,
35 | calls}).
36 |
37 | %error record
38 | -record(cover_error, {place,
39 | type,
40 | info = ""}).
41 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/debugger/erlide_debugger/src/erlide_debugger.app.src:
--------------------------------------------------------------------------------
1 | {application, erlide_debugger,
2 | [
3 | {description,"erlide_debugger"},
4 | {vsn, "0.118.0"},
5 | {erlide_context, debugger},
6 | {registered, []},
7 | {applications, [kernel, stdlib]},
8 | {env, []}
9 | ]}
10 | .
11 |
--------------------------------------------------------------------------------
/debugger/erlide_debugger/src/erlide_tracer.erl:
--------------------------------------------------------------------------------
1 | -module(erlide_tracer).
2 |
3 | -export([
4 | start/0,
5 | start/1,
6 | trace/1
7 | ]).
8 |
9 | %% send to this pid
10 | start(Pid) when is_pid(Pid) ->
11 | dbg:start(),
12 | dbg:tracer(process, {fun send_to_pid/2, Pid}),
13 | ok.
14 |
15 | %% output to log
16 | start() ->
17 | dbg:start(),
18 | dbg:tracer(process, {fun send_to_log/2, ok}),
19 | ok.
20 |
21 | send_to_pid(Message, Pid) ->
22 | Pid ! Message,
23 | Pid.
24 |
25 | send_to_log(Message, _) ->
26 | erlide_log:log({tracing, Message}),
27 | ok.
28 |
29 | trace(Module) ->
30 | dbg:p(all, [c]),
31 | dbg:tp(Module, cx),
32 | ok.
33 |
--------------------------------------------------------------------------------
/debugger/erlide_debugger/src/launcher.erl:
--------------------------------------------------------------------------------
1 | %% Author: Aleksandra Lipiec
2 | %% Created: 21-12-2010
3 | %% Description: cover launcher for coverage plugin
4 | %%----------------------------------------------
5 | -module(launcher).
6 | -behaviour(gen_server).
7 |
8 | %%----------------------------------------------
9 | %% Include files
10 | %%----------------------------------------------
11 | -include("coverage.hrl").
12 |
13 | %%----------------------------------------------
14 | %% Exported Functions
15 | %%----------------------------------------------
16 | -export([start/1,
17 | start_link/1,
18 | restart/1,
19 | stop/0,
20 | prepare/1,
21 | analyse/1,
22 | set_includes/1,
23 | set_report_dir/1]).
24 |
25 | -export([init/1,
26 | handle_call/3,
27 | handle_cast/2,
28 | terminate/2,
29 | code_change/3,
30 | handle_info/2]).
31 |
32 | %%----------------------------------------------
33 | %% API Functions
34 | %%----------------------------------------------
35 |
36 | start(Nodes) ->
37 | gen_server:start({local, ?MODULE}, ?MODULE, [Nodes], []).
38 |
39 | start_link(Nodes) ->
40 | gen_server:start_link({local, ?MODULE}, ?MODULE, [Nodes], []).
41 |
42 | % restarting cover
43 | restart(Nodes) ->
44 | case start(Nodes) of
45 | {ok, _} ->
46 | ok;
47 | {error, {already_started, _}} ->
48 | already_started;
49 | _ ->
50 | error
51 | end.
52 |
53 | stop() ->
54 | gen_server:cast(?MODULE, stop).
55 |
56 | %prepares modules - cover compiles them
57 | prepare(Paths) ->
58 | lists:foreach(fun(Path) ->
59 | Mod = list_to_atom(filename:basename(Path, ".erl")),
60 | gen_server:call(?MODULE, {compile, Mod, Path})
61 | end, Paths).
62 |
63 | % performes cover analysis and prepares reports
64 | analyse(Modules) ->
65 | gen_server:call(?MODULE, {analyse, Modules}).
66 |
67 | % set include directories
68 | set_includes(Includes) ->
69 | gen_server:call(?MODULE, {includes, Includes}).
70 |
71 | set_report_dir(Path) ->
72 | gen_server:call(?MODULE, {report_dir, Path}).
73 |
74 | %%----------------------------------------------
75 | %% Local Functions
76 | %%----------------------------------------------
77 |
78 | %init
79 | %starts cover on multiple nodes
80 | init([Nodes]) ->
81 | try cover:start(Nodes) of
82 | {ok, _} ->
83 | State = #state{},
84 | {ok, State};
85 | {error, Reason} ->
86 | erlide_jrpc:event(?EVENT, #cover_error{place = cover,
87 | type = starting,
88 | info = Reason}),
89 | {stop, Reason}
90 | catch
91 | _:_ ->
92 | erlide_jrpc:event(?EVENT, #cover_error{place = cover,
93 | type = starting,
94 | info = "cover error - check if it is installed"}),
95 | {stop, "cover error - check if it is installed"}
96 | end.
97 |
98 |
99 | % cast
100 | handle_cast(stop, State) ->
101 | {stop, normal, State}.
102 |
103 | % call
104 | handle_call({includes, Includes}, _From, State) ->
105 | {reply, ok, State#state{includes = Includes}};
106 |
107 | handle_call({report_dir, Path}, _From, State) ->
108 | {reply, ok, State#state{report_dir = Path}};
109 |
110 | handle_call({compile, Module, Path}, _From, #state{includes = Includes} = State) ->
111 | Res = coverage:compile(Module, Path, Includes),
112 | {reply, Res, State};
113 |
114 | handle_call({analyse, Modules}, _From, State) ->
115 | io:format("~p~n", [Modules]),
116 | ModsOk = coverage:create_report(Modules, ?COVER_DIR),
117 | io:format("~p~n", [ModsOk]),
118 | Path = case ModsOk of
119 | #cover_error{} ->
120 | erlide_jrpc:event(?EVENT, ModsOk),
121 | no_file;
122 | _ ->
123 | coverage:create_index(ModsOk, ?COVER_DIR)
124 | end,
125 |
126 | erlide_jrpc:event(?EVENT, ?FINISHED),
127 |
128 | {reply, Path, State};
129 |
130 |
131 | %% cast default
132 | handle_call(_, _From, State) ->
133 | {reply, bad_option, State}.
134 |
135 | %terminate
136 | terminate(normal, _State) ->
137 | init:stop(0);
138 | terminate(_Reason, _State) ->
139 | init:stop(1).
140 |
141 | handle_info(_Info, State) ->
142 | {noreply, State}.
143 |
144 | code_change(_OldVsn, State, _Extra) ->
145 | {ok, State}.
146 |
147 | %%----------------------------------------------
148 | %% Helpers
149 | %%----------------------------------------------
150 |
151 |
152 |
--------------------------------------------------------------------------------
/debugger/erlide_debugger/src/test.hrl:
--------------------------------------------------------------------------------
1 | %% Author: Aleksandra Lipiec
2 | %% Created: 17-02-2011
3 | %% Description: definitions and constants for testing helper
4 | %%-------------------------------------------------------------
5 |
6 | -define(TEVENT, eunit_event).
7 |
8 |
9 | %state
10 | -record(test_state, {type,
11 | output = ""}).
12 |
13 | -record(result, {pass,
14 | fail,
15 | skip,
16 | cancel}).
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/debugger/erlide_debugger/src/test_listener.erl:
--------------------------------------------------------------------------------
1 | %% Author: Aleksandra Lipiec
2 | %% Created: 20-10-2011
3 | %% Description: eunit test listener
4 | %% (listens for test results and forwards them to ErlIde)
5 | %%----------------------------------------------
6 | -module(test_listener).
7 | -behaviour(eunit_listener).
8 |
9 | %%----------------------------------------------
10 | %% Include files
11 | %%----------------------------------------------
12 | -include_lib("eunit/include/eunit.hrl").
13 | -include("test.hrl").
14 |
15 |
16 | %%----------------------------------------------
17 | %% Exported Functions
18 | %%----------------------------------------------
19 |
20 | -export([start/0, start/1]).
21 |
22 | -export([init/1, handle_begin/3, handle_end/3, handle_cancel/3,
23 | terminate/2]).
24 |
25 |
26 | %%----------------------------------------------
27 | %% API Functions
28 | %%----------------------------------------------
29 |
30 | start() ->
31 | start([]).
32 |
33 | start(Options) ->
34 | eunit_listener:start(?MODULE, Options).
35 |
36 | init(_Options) ->
37 | St = [],
38 | receive
39 | {start, _Reference} ->
40 | St
41 | end.
42 |
43 | terminate({ok, Data}, _St) ->
44 | io:format("blab"),
45 | Pass = proplists:get_value(pass, Data, 0),
46 | Fail = proplists:get_value(fail, Data, 0),
47 | Skip = proplists:get_value(skip, Data, 0),
48 | Cancel = proplists:get_value(cancel, Data, 0),
49 | erlide_jrpc:event(?TEVENT, #result{pass = Pass,
50 | fail = Fail,
51 | skip = Skip,
52 | cancel = Cancel}),
53 | sync_end(ok);
54 | terminate({error, _Reason}, _St) ->
55 | erlide_jrpc:event(?TEVENT, {end_with_error, blab}),
56 | sync_end(error).
57 |
58 | sync_end(Result) ->
59 | receive
60 | {stop, Reference, ReplyTo} ->
61 | ReplyTo ! {result, Reference, Result},
62 | ok
63 | end.
64 |
65 | handle_begin(group, Data, St) ->
66 | Desc = proplists:get_value(desc, Data),
67 | Group = case St of
68 | [H | _T] -> make_list(H);
69 | _ ->
70 | ""
71 | end,
72 | if Desc =/= "", Desc =/= undefined ->
73 | erlide_jrpc:event(?TEVENT, {gbegin, Group, make_list(Desc)}),
74 | [Desc | St];
75 | true ->
76 | St
77 | end;
78 | handle_begin(test, Data, St) ->
79 | Desc = make_list(proplists:get_value(desc, Data)),
80 | Line = proplists:get_value(line, Data, 0),
81 | Group = case St of
82 | [H | _T] -> make_list(H);
83 | _ ->
84 | ""
85 | end,
86 | erlide_jrpc:event(?TEVENT, {tbegin, Group, Desc, Line}),
87 | St.
88 |
89 | handle_end(group, Data, St) ->
90 | Desc = proplists:get_value(desc, Data),
91 | if Desc =/= "", Desc =/= undefined ->
92 | Time = proplists:get_value(time, Data),
93 | erlide_jrpc:event(?TEVENT, {gend, make_list(Desc), Time}),
94 | lists:delete(Desc, St);
95 | true ->
96 | St
97 | end;
98 | handle_end(test, Data, St) ->
99 | Desc = make_list(proplists:get_value(desc, Data)),
100 | Line = proplists:get_value(line, Data, 0),
101 | Source = case proplists:get_value(source, Data) of
102 | {SM, SF, SA} ->
103 | {SM, SF, SA};
104 | _ ->
105 | {[], [], 0}
106 | end,
107 | Group = case St of
108 | [H | _T] -> make_list(H);
109 | _ ->
110 | ""
111 | end,
112 | case proplists:get_value(status, Data) of
113 | ok ->
114 | Time = proplists:get_value(time, Data, 0),
115 | erlide_jrpc:event(?TEVENT, {tend, Group, Desc, Line, Source, Time});
116 | {error, Exception} ->
117 | erlide_jrpc:event(?TEVENT, {error, Group, Desc, Line, Source, Exception} );
118 | {skipped, {module_not_found, M}} ->
119 | erlide_jrpc:event(?TEVENT, {skipped, module_not_found, Group, Desc, Line, Source, M});
120 | {skipped, {no_such_function, {M, F, A}}} ->
121 | erlide_jrpc:event(?TEVENT, {skipped, no_such_function, Group, Desc, Line, Source, {M, F, A}})
122 | end,
123 | St.
124 |
125 | handle_cancel(group, Data, St) ->
126 | Desc = proplists:get_value(desc, Data),
127 | Res = cancel_info(Data),
128 | erlide_jrpc:event(?TEVENT, {gcanceled, make_list(Desc), Res}),
129 | if Desc =/= "", Desc =/= undefined ->
130 | lists:delete(Desc, St);
131 | true ->
132 | St
133 | end;
134 | handle_cancel(test, Data, St) ->
135 | Desc = make_list(proplists:get_value(desc, Data)),
136 | Line = proplists:get_value(line, Data, 0),
137 | Res = cancel_info(Data),
138 | Source = case proplists:get_value(source, Data) of
139 | {SM, SF, SA} ->
140 | {SM, SF, SA};
141 | _ ->
142 | {[], [], 0}
143 | end,
144 | Group = case St of
145 | [H | _T] -> make_list(H);
146 | _ ->
147 | ""
148 | end,
149 | erlide_jrpc:event(?TEVENT, {tcanceled, Group, Desc, Line, Res, Source}),
150 | St.
151 |
152 | %%--------------
153 | %% Helpers
154 | %%--------------
155 |
156 |
157 | cancel_info(Data) ->
158 | case proplists:get_value(reason, Data) of
159 | undefined ->
160 | 'skipped';
161 | timeout ->
162 | 'timeout';
163 | {startup, Reason} ->
164 | list_to_atom(io_lib:format("could not start test process\n::~P\n\n",
165 | [Reason, 15]));
166 | {blame, _SubId} ->
167 | 'cancelled because of subtask';
168 | {exit, Reason} ->
169 | list_to_atom(io_lib:format("unexpected termination of test process\n::~P\n\n",
170 | [Reason, 15]));
171 | {abort, {Reason, _}} ->
172 | Reason
173 | end.
174 |
175 | make_list(H) when is_binary(H) ->
176 | list_to_atom(binary_to_list(H));
177 | make_list(H) ->
178 | H.
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
--------------------------------------------------------------------------------
/debugger/erlide_debugger/src/testlauncher.erl:
--------------------------------------------------------------------------------
1 | %% Author: Aleksandra Lipiec
2 | %% Created: 17-02-2011
3 | %% Description: test launcher for testing cover plugin
4 | %%----------------------------------------------
5 | -module(testlauncher).
6 | -behaviour(gen_server).
7 |
8 | %%----------------------------------------------
9 | %% Include files
10 | %%----------------------------------------------
11 | -include("test.hrl").
12 | -include("coverage.hrl").
13 |
14 | %%----------------------------------------------
15 | %% Exported Functions
16 | %%----------------------------------------------
17 | -export([start/1,
18 | start_link/1,
19 | stop/0,
20 | run_tests/2,
21 | set_output_dir/1]).
22 |
23 | -export([init/1,
24 | handle_call/3,
25 | handle_cast/2,
26 | terminate/2,
27 | code_change/3,
28 | handle_info/2]).
29 |
30 | %%----------------------------------------------
31 | %% API Functions
32 | %%----------------------------------------------
33 |
34 | start(Type) ->
35 | gen_server:start({local, ?MODULE}, ?MODULE, [Type], []).
36 |
37 | start_link(Type) ->
38 | gen_server:start_link({local, ?MODULE}, ?MODULE, [Type], []).
39 |
40 | stop() ->
41 | gen_server:cast(?MODULE, stop).
42 |
43 | run_tests(Type, Path) ->
44 | TypeAtom = list_to_atom(Type),
45 | gen_server:call(?MODULE, {test, TypeAtom, Path}).
46 |
47 | % adds output dir to the code path
48 | set_output_dir(Dir) ->
49 | gen_server:call(?MODULE,{output_dir,Dir}).
50 |
51 | %%----------------------------------------------
52 | %% Local Functions
53 | %%----------------------------------------------
54 |
55 | init([Type]) ->
56 | State = #test_state{type = Type},
57 | {ok, State}.
58 |
59 | handle_call({output_dir, Dir}, _From, #test_state{output = DirOld} = State) ->
60 | code:del_path(DirOld),
61 | code:add_pathz(Dir),
62 | {reply, ok, State#test_state{output = Dir}};
63 |
64 | handle_call({test, module, Path}, _From, State) ->
65 | Module = list_to_atom(filename:basename(Path, ".erl")),
66 | TestA = list_to_atom(atom_to_list(Module) ++ "_tests"),
67 | code:purge(TestA),
68 | code:load_file(TestA),
69 | Res = coverage:prepare(State#test_state.type, Module), %%should be moved
70 | {reply, Res, State};
71 |
72 | handle_call({test, all, Path}, _From, State) ->
73 | ModulesTst = get_modules(Path),
74 | Res = lists:foldl(fun(Tst, Acc) ->
75 | TestA = list_to_atom(Tst),
76 | code:purge(TestA),
77 | code:load_file(TestA),
78 | case {Acc, coverage:prepare(State#test_state.type, TestA)} of
79 | {ok, ok} ->
80 | ok;
81 | _ ->
82 | #cover_error{place = Path,
83 | type = testing,
84 | info = ""}
85 | end
86 | end, ok,
87 | ModulesTst),
88 | {reply, Res, State}.
89 |
90 | handle_cast(stop, State) ->
91 | {stop, normal, State}.
92 |
93 | %terminate
94 | terminate(normal, _State) ->
95 | init:stop(0);
96 | terminate(_Reason, _State) ->
97 | init:stop(1).
98 |
99 | handle_info(_Info, State) ->
100 | {noreply, State}.
101 |
102 | code_change(_OldVsn, State, _Extra) ->
103 | {ok, State}.
104 |
105 | %%----------------------------------------------
106 | %% Helpers
107 | %%----------------------------------------------
108 |
109 | get_modules(Dir) ->
110 | filelib:fold_files(Dir,
111 | ".*\.erl",
112 | true,
113 | fun(F, Acc) ->
114 | [filename:basename(F, ".erl") | Acc]
115 | end, []).
116 |
117 |
118 |
119 |
--------------------------------------------------------------------------------
/debugger/erlide_debugger_25/build:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | source ../../build_utils.sh
4 |
5 | dir=`pwd`
6 | prj=`basename $dir`
7 |
8 | build_project ../../rebar3 $prj 25 "$@"
9 |
--------------------------------------------------------------------------------
/debugger/erlide_debugger_25/include/.keep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erlang/erlide_kernel/ba61079066c495ad22f4da52da294cf0f97d489f/debugger/erlide_debugger_25/include/.keep
--------------------------------------------------------------------------------
/debugger/erlide_debugger_25/priv/.keep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erlang/erlide_kernel/ba61079066c495ad22f4da52da294cf0f97d489f/debugger/erlide_debugger_25/priv/.keep
--------------------------------------------------------------------------------
/debugger/erlide_debugger_25/rebar.config:
--------------------------------------------------------------------------------
1 | {require_otp_vsn, "25.*"}.
2 |
3 | {plugins, []}.
4 |
5 | {erl_opts, []}.
6 | {edoc_opts,[{todo,true}]}.
7 |
8 | {eunit_opts, [verbose, {report,{eunit_surefire,[{dir,"."}]}}]}.
9 |
10 | {cover_export_enabled, true}.
11 | {cover_enabled, false}.
12 | {cover_print_enable, true}.
13 |
14 | {covertool_eunit, {".eunit/cover.coverdata", "eunit.coverage.xml"}}.
15 | {covertool_prefix_len, 0}.
16 |
17 | {xref_checks,[
18 | undefined_function_calls,
19 | undefined_functions,
20 | locals_not_used,
21 | %exports_not_used,
22 | deprecated_function_calls,
23 | deprecated_functions
24 | ]}.
25 |
--------------------------------------------------------------------------------
/debugger/erlide_debugger_25/rebar.lock:
--------------------------------------------------------------------------------
1 | [].
2 |
--------------------------------------------------------------------------------
/debugger/erlide_debugger_25/src/dbg_debugged.erl:
--------------------------------------------------------------------------------
1 | %%
2 | %% %CopyrightBegin%
3 | %%
4 | %% Copyright Ericsson AB 1998-2018. All Rights Reserved.
5 | %%
6 | %% Licensed under the Apache License, Version 2.0 (the "License");
7 | %% you may not use this file except in compliance with the License.
8 | %% You may obtain a copy of the License at
9 | %%
10 | %% http://www.apache.org/licenses/LICENSE-2.0
11 | %%
12 | %% Unless required by applicable law or agreed to in writing, software
13 | %% distributed under the License is distributed on an "AS IS" BASIS,
14 | %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 | %% See the License for the specific language governing permissions and
16 | %% limitations under the License.
17 | %%
18 | %% %CopyrightEnd%
19 | -module(dbg_debugged).
20 |
21 | %% External exports
22 | -export([eval/3]).
23 |
24 | %%====================================================================
25 | %% External exports
26 | %%====================================================================
27 |
28 | %%--------------------------------------------------------------------
29 | %% eval(Mod, Func, Args) -> Value
30 | %% Main entry point from external (non-interpreted) code.
31 | %% Called via the error handler.
32 | %%--------------------------------------------------------------------
33 | eval(Mod, Func, Args) ->
34 | Meta = dbg_ieval:eval(Mod, Func, Args),
35 | Mref = erlang:monitor(process, Meta),
36 | msg_loop(Meta, Mref).
37 |
38 | %%====================================================================
39 | %% Internal functions
40 | %%====================================================================
41 |
42 | msg_loop(Meta, Mref) ->
43 | receive
44 |
45 | %% Evaluated function has returned a value
46 | {sys, Meta, {ready, Val}} ->
47 | erlang:demonitor(Mref, [flush]),
48 | case Val of
49 | {dbg_apply,M,F,A} ->
50 | apply(M, F, A);
51 | _ ->
52 | Val
53 | end;
54 |
55 | %% Evaluated function raised an (uncaught) exception
56 | {sys, Meta, {exception,{Class,Reason,Stacktrace}}} ->
57 | erlang:demonitor(Mref, [flush]),
58 |
59 | %% ...raise the same exception
60 | erlang:error(erlang:raise(Class, Reason, Stacktrace),
61 | [Class,Reason,Stacktrace]);
62 |
63 | %% Meta is evaluating a receive, must be done within context
64 | %% of real (=this) process
65 | {sys, Meta, {'receive',Msg}} ->
66 | receive Msg ->
67 | Meta ! {self(), rec_acked},
68 | ok
69 | end,
70 | msg_loop(Meta, Mref);
71 |
72 | %% Meta needs something evaluated within context of real process
73 | {sys, Meta, {command,Command}} ->
74 | Reply = handle_command(Command),
75 | Meta ! {sys, self(), Reply},
76 | msg_loop(Meta, Mref);
77 |
78 | %% Meta has terminated
79 | %% Must be due to int:stop() (or -heaven forbid- a debugger bug)
80 | {'DOWN', Mref, _, _, Reason} ->
81 | {interpreter_terminated, Reason}
82 | end.
83 |
84 | handle_command(Command) ->
85 | try
86 | reply(Command)
87 | catch Class:Reason:Stacktrace ->
88 | {exception,{Class,Reason,stacktrace_f(Stacktrace)}}
89 | end.
90 |
91 | reply({apply,M,F,As}) ->
92 | {value, erlang:apply(M,F,As)};
93 | reply({eval,Expr,Bs}) ->
94 | %% Bindings is an orddict (sort them)
95 | erl_eval:expr(Expr, lists:sort(Bs)). % {value, Value, Bs2}
96 |
97 | %% Fix stacktrace - keep all above call to this module.
98 | %%
99 | stacktrace_f([]) -> [];
100 | stacktrace_f([{?MODULE,_,_,_}|_]) -> [];
101 | stacktrace_f([F|S]) -> [F|stacktrace_f(S)].
102 |
--------------------------------------------------------------------------------
/debugger/erlide_debugger_25/src/dbg_idb.erl:
--------------------------------------------------------------------------------
1 | %%
2 | %% %CopyrightBegin%
3 | %%
4 | %% Copyright Ericsson AB 1998-2016. All Rights Reserved.
5 | %%
6 | %% Licensed under the Apache License, Version 2.0 (the "License");
7 | %% you may not use this file except in compliance with the License.
8 | %% You may obtain a copy of the License at
9 | %%
10 | %% http://www.apache.org/licenses/LICENSE-2.0
11 | %%
12 | %% Unless required by applicable law or agreed to in writing, software
13 | %% distributed under the License is distributed on an "AS IS" BASIS,
14 | %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 | %% See the License for the specific language governing permissions and
16 | %% limitations under the License.
17 | %%
18 | %% %CopyrightEnd%
19 | %%
20 | -module(dbg_idb).
21 |
22 | %% External exports
23 | -export([insert/3, lookup/2, match_object/2]).
24 |
25 | %%====================================================================
26 | %% External exports
27 | %%====================================================================
28 |
29 | insert(DbRef, Key, Value) ->
30 | case DbRef of
31 | {Node, ModDb} ->
32 | rpc:block_call(Node, ets, insert, [ModDb, {Key, Value}]);
33 | ModDb ->
34 | ets:insert(ModDb, {Key, Value})
35 | end.
36 |
37 | lookup(DbRef, Key) ->
38 | Res = case DbRef of
39 | {Node, ModDb} ->
40 | rpc:block_call(Node, ets, lookup, [ModDb, Key]);
41 | ModDb ->
42 | ets:lookup(ModDb, Key)
43 | end,
44 | case Res of
45 | [{Key, Value}] -> {ok, Value};
46 | _ -> not_found
47 | end.
48 |
49 | match_object(DbRef, Key) ->
50 | case DbRef of
51 | {Node, ModDb} ->
52 | rpc:block_call(Node, ets, match_object, [ModDb, Key]);
53 | ModDb ->
54 | ets:match_object(ModDb, Key)
55 | end.
56 |
--------------------------------------------------------------------------------
/debugger/erlide_debugger_25/src/dbg_ieval.hrl:
--------------------------------------------------------------------------------
1 | %%
2 | %% %CopyrightBegin%
3 | %%
4 | %% Copyright Ericsson AB 2005-2021. All Rights Reserved.
5 | %%
6 | %% Licensed under the Apache License, Version 2.0 (the "License");
7 | %% you may not use this file except in compliance with the License.
8 | %% You may obtain a copy of the License at
9 | %%
10 | %% http://www.apache.org/licenses/LICENSE-2.0
11 | %%
12 | %% Unless required by applicable law or agreed to in writing, software
13 | %% distributed under the License is distributed on an "AS IS" BASIS,
14 | %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 | %% See the License for the specific language governing permissions and
16 | %% limitations under the License.
17 | %%
18 | %% %CopyrightEnd%
19 | %%
20 | -record(ieval, {level = 1, % Current call level
21 | line = -1, % Current source code line (of module)
22 | module, % MFA which called the currently
23 | function, % interpreted function
24 | arguments, %
25 | error_info = [], % [{error_info,Map}] | []
26 |
27 | %% True if the current expression is at the top level
28 | %% (i.e. the next call will leave interpreted code).
29 | top = false
30 | }).
31 |
32 | -define(DB_REF_KEY(Mod), {Mod,db}).
33 |
--------------------------------------------------------------------------------
/debugger/erlide_debugger_25/src/erlide_debugger_25.app.src:
--------------------------------------------------------------------------------
1 | {application, erlide_debugger_25,
2 | [
3 | {description, "erlide_debugger_25"},
4 | {vsn, "0.118.0"},
5 | {erlide_context, debugger},
6 | {registered, []},
7 | {applications, [kernel, stdlib]},
8 | {env, []}
9 | ]
10 | }.
11 |
--------------------------------------------------------------------------------
/debugger/erlide_debugger_26/build:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | source ../../build_utils.sh
4 |
5 | dir=`pwd`
6 | prj=`basename $dir`
7 |
8 | build_project ../../rebar3 $prj 26 "$@"
9 |
--------------------------------------------------------------------------------
/debugger/erlide_debugger_26/include/.keep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erlang/erlide_kernel/ba61079066c495ad22f4da52da294cf0f97d489f/debugger/erlide_debugger_26/include/.keep
--------------------------------------------------------------------------------
/debugger/erlide_debugger_26/priv/.keep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erlang/erlide_kernel/ba61079066c495ad22f4da52da294cf0f97d489f/debugger/erlide_debugger_26/priv/.keep
--------------------------------------------------------------------------------
/debugger/erlide_debugger_26/rebar.config:
--------------------------------------------------------------------------------
1 | {require_otp_vsn, "26.*"}.
2 |
3 | {plugins, []}.
4 |
5 | {erl_opts, []}.
6 | {edoc_opts,[{todo,true}]}.
7 |
8 | {eunit_opts, [verbose, {report,{eunit_surefire,[{dir,"."}]}}]}.
9 |
10 | {cover_export_enabled, true}.
11 | {cover_enabled, false}.
12 | {cover_print_enable, true}.
13 |
14 | {covertool_eunit, {".eunit/cover.coverdata", "eunit.coverage.xml"}}.
15 | {covertool_prefix_len, 0}.
16 |
17 | {xref_checks,[
18 | undefined_function_calls,
19 | undefined_functions,
20 | locals_not_used,
21 | %exports_not_used,
22 | deprecated_function_calls,
23 | deprecated_functions
24 | ]}.
25 |
--------------------------------------------------------------------------------
/debugger/erlide_debugger_26/rebar.lock:
--------------------------------------------------------------------------------
1 | [].
2 |
--------------------------------------------------------------------------------
/debugger/erlide_debugger_26/src/dbg_debugged.erl:
--------------------------------------------------------------------------------
1 | %%
2 | %% %CopyrightBegin%
3 | %%
4 | %% Copyright Ericsson AB 1998-2018. All Rights Reserved.
5 | %%
6 | %% Licensed under the Apache License, Version 2.0 (the "License");
7 | %% you may not use this file except in compliance with the License.
8 | %% You may obtain a copy of the License at
9 | %%
10 | %% http://www.apache.org/licenses/LICENSE-2.0
11 | %%
12 | %% Unless required by applicable law or agreed to in writing, software
13 | %% distributed under the License is distributed on an "AS IS" BASIS,
14 | %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 | %% See the License for the specific language governing permissions and
16 | %% limitations under the License.
17 | %%
18 | %% %CopyrightEnd%
19 | -module(dbg_debugged).
20 |
21 | %% External exports
22 | -export([eval/3]).
23 |
24 | %%====================================================================
25 | %% External exports
26 | %%====================================================================
27 |
28 | %%--------------------------------------------------------------------
29 | %% eval(Mod, Func, Args) -> Value
30 | %% Main entry point from external (non-interpreted) code.
31 | %% Called via the error handler.
32 | %%--------------------------------------------------------------------
33 | eval(Mod, Func, Args) ->
34 | Meta = dbg_ieval:eval(Mod, Func, Args),
35 | Mref = erlang:monitor(process, Meta),
36 | msg_loop(Meta, Mref).
37 |
38 | %%====================================================================
39 | %% Internal functions
40 | %%====================================================================
41 |
42 | msg_loop(Meta, Mref) ->
43 | receive
44 |
45 | %% Evaluated function has returned a value
46 | {sys, Meta, {ready, Val}} ->
47 | erlang:demonitor(Mref, [flush]),
48 | case Val of
49 | {dbg_apply,M,F,A} ->
50 | apply(M, F, A);
51 | _ ->
52 | Val
53 | end;
54 |
55 | %% Evaluated function raised an (uncaught) exception
56 | {sys, Meta, {exception,{Class,Reason,Stacktrace}}} ->
57 | erlang:demonitor(Mref, [flush]),
58 |
59 | %% ...raise the same exception
60 | erlang:error(erlang:raise(Class, Reason, Stacktrace),
61 | [Class,Reason,Stacktrace]);
62 |
63 | %% Meta is evaluating a receive, must be done within context
64 | %% of real (=this) process
65 | {sys, Meta, {'receive',Msg}} ->
66 | receive Msg ->
67 | Meta ! {self(), rec_acked},
68 | ok
69 | end,
70 | msg_loop(Meta, Mref);
71 |
72 | %% Meta needs something evaluated within context of real process
73 | {sys, Meta, {command,Command}} ->
74 | Reply = handle_command(Command),
75 | Meta ! {sys, self(), Reply},
76 | msg_loop(Meta, Mref);
77 |
78 | %% Meta has terminated
79 | %% Must be due to int:stop() (or -heaven forbid- a debugger bug)
80 | {'DOWN', Mref, _, _, Reason} ->
81 | {interpreter_terminated, Reason}
82 | end.
83 |
84 | handle_command(Command) ->
85 | try
86 | reply(Command)
87 | catch Class:Reason:Stacktrace ->
88 | {exception,{Class,Reason,stacktrace_f(Stacktrace)}}
89 | end.
90 |
91 | reply({apply,M,F,As}) ->
92 | {value, erlang:apply(M,F,As)};
93 | reply({eval,Expr,Bs}) ->
94 | %% Bindings is an orddict (sort them)
95 | erl_eval:expr(Expr, lists:sort(Bs)). % {value, Value, Bs2}
96 |
97 | %% Fix stacktrace - keep all above call to this module.
98 | %%
99 | stacktrace_f([]) -> [];
100 | stacktrace_f([{?MODULE,_,_,_}|_]) -> [];
101 | stacktrace_f([F|S]) -> [F|stacktrace_f(S)].
102 |
--------------------------------------------------------------------------------
/debugger/erlide_debugger_26/src/dbg_idb.erl:
--------------------------------------------------------------------------------
1 | %%
2 | %% %CopyrightBegin%
3 | %%
4 | %% Copyright Ericsson AB 1998-2016. All Rights Reserved.
5 | %%
6 | %% Licensed under the Apache License, Version 2.0 (the "License");
7 | %% you may not use this file except in compliance with the License.
8 | %% You may obtain a copy of the License at
9 | %%
10 | %% http://www.apache.org/licenses/LICENSE-2.0
11 | %%
12 | %% Unless required by applicable law or agreed to in writing, software
13 | %% distributed under the License is distributed on an "AS IS" BASIS,
14 | %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 | %% See the License for the specific language governing permissions and
16 | %% limitations under the License.
17 | %%
18 | %% %CopyrightEnd%
19 | %%
20 | -module(dbg_idb).
21 |
22 | %% External exports
23 | -export([insert/3, lookup/2, match_object/2]).
24 |
25 | %%====================================================================
26 | %% External exports
27 | %%====================================================================
28 |
29 | insert(DbRef, Key, Value) ->
30 | case DbRef of
31 | {Node, ModDb} ->
32 | rpc:block_call(Node, ets, insert, [ModDb, {Key, Value}]);
33 | ModDb ->
34 | ets:insert(ModDb, {Key, Value})
35 | end.
36 |
37 | lookup(DbRef, Key) ->
38 | Res = case DbRef of
39 | {Node, ModDb} ->
40 | rpc:block_call(Node, ets, lookup, [ModDb, Key]);
41 | ModDb ->
42 | ets:lookup(ModDb, Key)
43 | end,
44 | case Res of
45 | [{Key, Value}] -> {ok, Value};
46 | _ -> not_found
47 | end.
48 |
49 | match_object(DbRef, Key) ->
50 | case DbRef of
51 | {Node, ModDb} ->
52 | rpc:block_call(Node, ets, match_object, [ModDb, Key]);
53 | ModDb ->
54 | ets:match_object(ModDb, Key)
55 | end.
56 |
--------------------------------------------------------------------------------
/debugger/erlide_debugger_26/src/dbg_ieval.hrl:
--------------------------------------------------------------------------------
1 | %%
2 | %% %CopyrightBegin%
3 | %%
4 | %% Copyright Ericsson AB 2005-2021. All Rights Reserved.
5 | %%
6 | %% Licensed under the Apache License, Version 2.0 (the "License");
7 | %% you may not use this file except in compliance with the License.
8 | %% You may obtain a copy of the License at
9 | %%
10 | %% http://www.apache.org/licenses/LICENSE-2.0
11 | %%
12 | %% Unless required by applicable law or agreed to in writing, software
13 | %% distributed under the License is distributed on an "AS IS" BASIS,
14 | %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 | %% See the License for the specific language governing permissions and
16 | %% limitations under the License.
17 | %%
18 | %% %CopyrightEnd%
19 | %%
20 | -record(ieval, {level = 1, % Current call level
21 | line = -1, % Current source code line (of module)
22 | module, % MFA which called the currently
23 | function, % interpreted function
24 | arguments, %
25 | error_info = [], % [{error_info,Map}] | []
26 |
27 | %% True if the current expression is at the top level
28 | %% (i.e. the next call will leave interpreted code).
29 | top = false
30 | }).
31 |
32 | -define(DB_REF_KEY(Mod), {Mod,db}).
33 |
--------------------------------------------------------------------------------
/debugger/erlide_debugger_26/src/erlide_debugger_26.app.src:
--------------------------------------------------------------------------------
1 | {application, erlide_debugger_26,
2 | [
3 | {description, "erlide_debugger_26"},
4 | {vsn, "0.118.0"},
5 | {erlide_context, debugger},
6 | {registered, []},
7 | {applications, [kernel, stdlib]},
8 | {env, []}
9 | ]
10 | }.
11 |
--------------------------------------------------------------------------------
/debugger/erlide_debugger_27/build:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | source ../../build_utils.sh
4 |
5 | dir=`pwd`
6 | prj=`basename $dir`
7 |
8 | build_project ../../rebar3 $prj 27 "$@"
9 |
--------------------------------------------------------------------------------
/debugger/erlide_debugger_27/include/.keep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erlang/erlide_kernel/ba61079066c495ad22f4da52da294cf0f97d489f/debugger/erlide_debugger_27/include/.keep
--------------------------------------------------------------------------------
/debugger/erlide_debugger_27/priv/.keep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erlang/erlide_kernel/ba61079066c495ad22f4da52da294cf0f97d489f/debugger/erlide_debugger_27/priv/.keep
--------------------------------------------------------------------------------
/debugger/erlide_debugger_27/rebar.config:
--------------------------------------------------------------------------------
1 | {require_otp_vsn, "27.*"}.
2 |
3 | {plugins, []}.
4 |
5 | {erl_opts, []}.
6 | {edoc_opts,[{todo,true}]}.
7 |
8 | {eunit_opts, [verbose, {report,{eunit_surefire,[{dir,"."}]}}]}.
9 |
10 | {cover_export_enabled, true}.
11 | {cover_enabled, false}.
12 | {cover_print_enable, true}.
13 |
14 | {covertool_eunit, {".eunit/cover.coverdata", "eunit.coverage.xml"}}.
15 | {covertool_prefix_len, 0}.
16 |
17 | {xref_checks,[
18 | undefined_function_calls,
19 | undefined_functions,
20 | locals_not_used,
21 | %exports_not_used,
22 | deprecated_function_calls,
23 | deprecated_functions
24 | ]}.
25 |
--------------------------------------------------------------------------------
/debugger/erlide_debugger_27/rebar.lock:
--------------------------------------------------------------------------------
1 | [].
2 |
--------------------------------------------------------------------------------
/debugger/erlide_debugger_27/src/dbg_debugged.erl:
--------------------------------------------------------------------------------
1 | %%
2 | %% %CopyrightBegin%
3 | %%
4 | %% Copyright Ericsson AB 1998-2024. All Rights Reserved.
5 | %%
6 | %% Licensed under the Apache License, Version 2.0 (the "License");
7 | %% you may not use this file except in compliance with the License.
8 | %% You may obtain a copy of the License at
9 | %%
10 | %% http://www.apache.org/licenses/LICENSE-2.0
11 | %%
12 | %% Unless required by applicable law or agreed to in writing, software
13 | %% distributed under the License is distributed on an "AS IS" BASIS,
14 | %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 | %% See the License for the specific language governing permissions and
16 | %% limitations under the License.
17 | %%
18 | %% %CopyrightEnd%
19 | -module(dbg_debugged).
20 | -moduledoc false.
21 |
22 | %% External exports
23 | -export([eval/3]).
24 |
25 | %%====================================================================
26 | %% External exports
27 | %%====================================================================
28 |
29 | %%--------------------------------------------------------------------
30 | %% eval(Mod, Func, Args) -> Value
31 | %% Main entry point from external (non-interpreted) code.
32 | %% Called via the error handler.
33 | %%--------------------------------------------------------------------
34 | eval(Mod, Func, Args) ->
35 | Meta = dbg_ieval:eval(Mod, Func, Args),
36 | Mref = erlang:monitor(process, Meta),
37 | msg_loop(Meta, Mref).
38 |
39 | %%====================================================================
40 | %% Internal functions
41 | %%====================================================================
42 |
43 | msg_loop(Meta, Mref) ->
44 | receive
45 |
46 | %% Evaluated function has returned a value
47 | {sys, Meta, {ready, Val}} ->
48 | erlang:demonitor(Mref, [flush]),
49 | case Val of
50 | {dbg_apply,M,F,A} ->
51 | apply(M, F, A);
52 | _ ->
53 | Val
54 | end;
55 |
56 | %% Evaluated function raised an (uncaught) exception
57 | {sys, Meta, {exception,{Class,Reason,Stacktrace}}} ->
58 | erlang:demonitor(Mref, [flush]),
59 |
60 | %% ...raise the same exception
61 | erlang:error(erlang:raise(Class, Reason, Stacktrace),
62 | [Class,Reason,Stacktrace]);
63 |
64 | %% Meta is evaluating a receive, must be done within context
65 | %% of real (=this) process
66 | {sys, Meta, {'receive',Msg}} ->
67 | receive Msg ->
68 | Meta ! {self(), rec_acked},
69 | ok
70 | end,
71 | msg_loop(Meta, Mref);
72 |
73 | %% Meta needs something evaluated within context of real process
74 | {sys, Meta, {command,Command}} ->
75 | Reply = handle_command(Command),
76 | Meta ! {sys, self(), Reply},
77 | msg_loop(Meta, Mref);
78 |
79 | %% Meta has terminated
80 | %% Must be due to int:stop() (or -heaven forbid- a debugger bug)
81 | {'DOWN', Mref, _, _, Reason} ->
82 | {interpreter_terminated, Reason}
83 | end.
84 |
85 | handle_command(Command) ->
86 | try
87 | reply(Command)
88 | catch Class:Reason:Stacktrace ->
89 | {exception,{Class,Reason,stacktrace_f(Stacktrace)}}
90 | end.
91 |
92 | reply({apply,M,F,As}) ->
93 | {value, erlang:apply(M,F,As)};
94 | reply({eval,Expr,Bs}) ->
95 | %% Bindings is an orddict (sort them)
96 | erl_eval:expr(Expr, lists:sort(Bs)). % {value, Value, Bs2}
97 |
98 | %% Fix stacktrace - keep all above call to this module.
99 | %%
100 | stacktrace_f([]) -> [];
101 | stacktrace_f([{?MODULE,_,_,_}|_]) -> [];
102 | stacktrace_f([F|S]) -> [F|stacktrace_f(S)].
103 |
--------------------------------------------------------------------------------
/debugger/erlide_debugger_27/src/dbg_idb.erl:
--------------------------------------------------------------------------------
1 | %%
2 | %% %CopyrightBegin%
3 | %%
4 | %% Copyright Ericsson AB 1998-2024. All Rights Reserved.
5 | %%
6 | %% Licensed under the Apache License, Version 2.0 (the "License");
7 | %% you may not use this file except in compliance with the License.
8 | %% You may obtain a copy of the License at
9 | %%
10 | %% http://www.apache.org/licenses/LICENSE-2.0
11 | %%
12 | %% Unless required by applicable law or agreed to in writing, software
13 | %% distributed under the License is distributed on an "AS IS" BASIS,
14 | %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 | %% See the License for the specific language governing permissions and
16 | %% limitations under the License.
17 | %%
18 | %% %CopyrightEnd%
19 | %%
20 | -module(dbg_idb).
21 | -moduledoc false.
22 |
23 | %% External exports
24 | -export([insert/3, lookup/2, match_object/2]).
25 |
26 | %%====================================================================
27 | %% External exports
28 | %%====================================================================
29 |
30 | insert(DbRef, Key, Value) ->
31 | case DbRef of
32 | {Node, ModDb} ->
33 | rpc:block_call(Node, ets, insert, [ModDb, {Key, Value}]);
34 | ModDb ->
35 | ets:insert(ModDb, {Key, Value})
36 | end.
37 |
38 | lookup(DbRef, Key) ->
39 | Res = case DbRef of
40 | {Node, ModDb} ->
41 | rpc:block_call(Node, ets, lookup, [ModDb, Key]);
42 | ModDb ->
43 | ets:lookup(ModDb, Key)
44 | end,
45 | case Res of
46 | [{Key, Value}] -> {ok, Value};
47 | _ -> not_found
48 | end.
49 |
50 | match_object(DbRef, Key) ->
51 | case DbRef of
52 | {Node, ModDb} ->
53 | rpc:block_call(Node, ets, match_object, [ModDb, Key]);
54 | ModDb ->
55 | ets:match_object(ModDb, Key)
56 | end.
57 |
--------------------------------------------------------------------------------
/debugger/erlide_debugger_27/src/dbg_ieval.hrl:
--------------------------------------------------------------------------------
1 | %%
2 | %% %CopyrightBegin%
3 | %%
4 | %% Copyright Ericsson AB 2005-2021. All Rights Reserved.
5 | %%
6 | %% Licensed under the Apache License, Version 2.0 (the "License");
7 | %% you may not use this file except in compliance with the License.
8 | %% You may obtain a copy of the License at
9 | %%
10 | %% http://www.apache.org/licenses/LICENSE-2.0
11 | %%
12 | %% Unless required by applicable law or agreed to in writing, software
13 | %% distributed under the License is distributed on an "AS IS" BASIS,
14 | %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 | %% See the License for the specific language governing permissions and
16 | %% limitations under the License.
17 | %%
18 | %% %CopyrightEnd%
19 | %%
20 | -record(ieval, {level = 1, % Current call level
21 | line = -1, % Current source code line (of module)
22 | module, % MFA which called the currently
23 | function, % interpreted function
24 | arguments, %
25 | error_info = [], % [{error_info,Map}] | []
26 |
27 | %% True if the current expression is at the top level
28 | %% (i.e. the next call will leave interpreted code).
29 | top = false
30 | }).
31 |
32 | -define(DB_REF_KEY(Mod), {Mod,db}).
33 |
--------------------------------------------------------------------------------
/debugger/erlide_debugger_27/src/erlide_debugger_27.app.src:
--------------------------------------------------------------------------------
1 | {application, erlide_debugger_27,
2 | [
3 | {description, "erlide_debugger_27"},
4 | {vsn, "0.118.0"},
5 | {erlide_context, debugger},
6 | {registered, []},
7 | {applications, [kernel, stdlib]},
8 | {env, []}
9 | ]
10 | }.
11 |
--------------------------------------------------------------------------------
/docs/articles/kernel/.keep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erlang/erlide_kernel/ba61079066c495ad22f4da52da294cf0f97d489f/docs/articles/kernel/.keep
--------------------------------------------------------------------------------
/docs/model_api.md:
--------------------------------------------------------------------------------
1 | # input
2 |
3 | * add project (+config!)
4 | * add/remove/update file/dir
5 | * update text @pos (value)
6 |
7 | #output
8 |
9 | ## syntax highlighting
10 |
11 | * get tokens @pos @length
12 |
13 | * spi for semantic handlers (filter token list, replace with enhanced kind)
14 |
15 | ## outline / content assist
16 |
17 | * get Type of Scope (matching Pattern)
18 | * get docs of Item
19 |
20 | * spi for doc handlers
21 |
22 | ## search
23 |
24 | * get refs of Item
25 | * get defs of Item
26 |
27 | advanced:
28 | * get undefined (all with defs==0)
29 | * get unused (all with refs==0)
30 |
31 | * spi for filters
32 |
33 | ## validation
34 |
35 | * get markers for Container
36 |
37 | * spi to add validators: syntax, xrefs, etc
38 |
39 | ## folding
40 |
41 | ## pretty-print/indent
42 |
43 | ## partitioning
44 |
45 | # others
46 |
47 | These don't need the model machinery?
48 |
49 | ## templates
50 |
51 | ## quick fixes
52 |
53 | ## autoedit
54 |
55 | ## wizards?
56 |
57 | # interface with Java
58 |
59 | * do we cache anything on the java side? preliminary: only values for currently visible/active stuff
60 | * java objects have no state, are just values
61 | * use events extensively (both directions), so that we don't have to keep track of hundreds of listeners
62 | * we need generic implementations of eclipse functionality that listens/sends events (see xtext?)
63 |
64 | CAN WE DO THIS WITHOUT STARTING AFRESH?
65 |
66 | # SPI in Erlang
67 |
68 | How to implement plugin functionality in Erlang? More precisely, how we register and find all modules implementing a certain extension point (to use Eclipse terminology)
69 |
70 |
71 |
--------------------------------------------------------------------------------
/eclipse/.gitignore:
--------------------------------------------------------------------------------
1 | *.beam
2 | *.app
3 | target
4 | *.zip
5 |
--------------------------------------------------------------------------------
/eclipse/.mvn/extensions.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | org.eclipse.tycho.extras
5 | tycho-pomless
6 | 0.24.0
7 |
8 |
9 |
--------------------------------------------------------------------------------
/eclipse/.mvn/wrapper/maven-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erlang/erlide_kernel/ba61079066c495ad22f4da52da294cf0f97d489f/eclipse/.mvn/wrapper/maven-wrapper.jar
--------------------------------------------------------------------------------
/eclipse/.mvn/wrapper/maven-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.3.9/apache-maven-3.3.9-bin.zip
--------------------------------------------------------------------------------
/eclipse/build:
--------------------------------------------------------------------------------
1 | #! /bin/bash -e
2 |
3 | source ../build_utils.sh
4 |
5 | dir=`pwd`
6 | prj=`basename $dir`
7 |
8 | echo "Building $prj..."
9 |
10 | rm -rf org.erlide.kernel.common/ebin
11 | rm -rf org.erlide.kernel.debugger/ebin
12 | rm -rf org.erlide.kernel.ide/ebin
13 |
14 | mkdir -p org.erlide.kernel.common/ebin
15 | mkdir -p org.erlide.kernel.debugger/ebin
16 | mkdir -p org.erlide.kernel.debugger/ebin/25
17 | mkdir -p org.erlide.kernel.debugger/ebin/26
18 | mkdir -p org.erlide.kernel.debugger/ebin/27
19 | mkdir -p org.erlide.kernel.ide/ebin
20 |
21 | # what if we keep the otp app structure? /priv might be useful
22 |
23 | find ../common/_build/default/lib -type f \( -name "*.beam" -o -name "*.app" \) -exec cp {} org.erlide.kernel.common/ebin/ \;
24 | find ../debugger/erlide_debugger/_build/default/lib -type f \( -name "*.beam" -o -name "*.app" \) ! -path "*/erlide_debugger_25/*" -exec cp {} org.erlide.kernel.debugger/ebin/ \;
25 | find ../debugger/erlide_debugger_25/_build/default/lib -type f \( -name "*.beam" -o -name "*.app" \) -exec cp {} org.erlide.kernel.debugger/ebin/25/ \;
26 | find ../debugger/erlide_debugger_26/_build/default/lib -type f \( -name "*.beam" -o -name "*.app" \) -exec cp {} org.erlide.kernel.debugger/ebin/26/ \;
27 | find ../debugger/erlide_debugger_27/_build/default/lib -type f \( -name "*.beam" -o -name "*.app" \) -exec cp {} org.erlide.kernel.debugger/ebin/27/ \;
28 | find ../ide/_build/default/lib -type f \( -name "*.beam" -o -name "*.app" \) -exec cp {} org.erlide.kernel.ide/ebin/ \;
29 |
30 | VSN=`get_feature_vsn org.erlide.kernel.feature`
31 |
32 | chmod u+x mvnw
33 | ./mvnw -B -U tycho-versions:set-version -DnewVersion=${VSN}.qualifier -Dartifacts=org.erlide.kernel.feature,org.erlide.kernel.debugger,org.erlide.kernel.ide,org.erlide.kernel.site,org.erlide.kernel.common
34 | # there will be an error if versions don't match
35 |
36 | ./mvnw -B -U clean verify
37 |
38 | mv org.erlide.kernel.site/target/org.erlide.kernel.site-*.zip .
39 | f=`ls org.erlide.kernel.site-${VSN}-SNAPSHOT.zip`
40 | newName=${f/-SNAPSHOT/}
41 | mv "$f" "$newName"
42 |
43 |
--------------------------------------------------------------------------------
/eclipse/mvnw.cmd:
--------------------------------------------------------------------------------
1 | @REM ----------------------------------------------------------------------------
2 | @REM Licensed to the Apache Software Foundation (ASF) under one
3 | @REM or more contributor license agreements. See the NOTICE file
4 | @REM distributed with this work for additional information
5 | @REM regarding copyright ownership. The ASF licenses this file
6 | @REM to you under the Apache License, Version 2.0 (the
7 | @REM "License"); you may not use this file except in compliance
8 | @REM with the License. You may obtain a copy of the License at
9 | @REM
10 | @REM http://www.apache.org/licenses/LICENSE-2.0
11 | @REM
12 | @REM Unless required by applicable law or agreed to in writing,
13 | @REM software distributed under the License is distributed on an
14 | @REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 | @REM KIND, either express or implied. See the License for the
16 | @REM specific language governing permissions and limitations
17 | @REM under the License.
18 | @REM ----------------------------------------------------------------------------
19 |
20 | @REM ----------------------------------------------------------------------------
21 | @REM Maven2 Start Up Batch script
22 | @REM
23 | @REM Required ENV vars:
24 | @REM JAVA_HOME - location of a JDK home dir
25 | @REM
26 | @REM Optional ENV vars
27 | @REM M2_HOME - location of maven2's installed home dir
28 | @REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
29 | @REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending
30 | @REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
31 | @REM e.g. to debug Maven itself, use
32 | @REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
33 | @REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
34 | @REM ----------------------------------------------------------------------------
35 |
36 | @REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
37 | @echo off
38 | @REM enable echoing my setting MAVEN_BATCH_ECHO to 'on'
39 | @if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
40 |
41 | @REM set %HOME% to equivalent of $HOME
42 | if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
43 |
44 | @REM Execute a user defined script before this one
45 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
46 | @REM check for pre script, once with legacy .bat ending and once with .cmd ending
47 | if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
48 | if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
49 | :skipRcPre
50 |
51 | @setlocal
52 |
53 | set ERROR_CODE=0
54 |
55 | @REM To isolate internal variables from possible post scripts, we use another setlocal
56 | @setlocal
57 |
58 | @REM ==== START VALIDATION ====
59 | if not "%JAVA_HOME%" == "" goto OkJHome
60 |
61 | echo.
62 | echo Error: JAVA_HOME not found in your environment. >&2
63 | echo Please set the JAVA_HOME variable in your environment to match the >&2
64 | echo location of your Java installation. >&2
65 | echo.
66 | goto error
67 |
68 | :OkJHome
69 | if exist "%JAVA_HOME%\bin\java.exe" goto init
70 |
71 | echo.
72 | echo Error: JAVA_HOME is set to an invalid directory. >&2
73 | echo JAVA_HOME = "%JAVA_HOME%" >&2
74 | echo Please set the JAVA_HOME variable in your environment to match the >&2
75 | echo location of your Java installation. >&2
76 | echo.
77 | goto error
78 |
79 | @REM ==== END VALIDATION ====
80 |
81 | :init
82 |
83 | set MAVEN_CMD_LINE_ARGS=%MAVEN_CONFIG% %*
84 |
85 | @REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
86 | @REM Fallback to current working directory if not found.
87 |
88 | set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
89 | IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
90 |
91 | set EXEC_DIR=%CD%
92 | set WDIR=%EXEC_DIR%
93 | :findBaseDir
94 | IF EXIST "%WDIR%"\.mvn goto baseDirFound
95 | cd ..
96 | IF "%WDIR%"=="%CD%" goto baseDirNotFound
97 | set WDIR=%CD%
98 | goto findBaseDir
99 |
100 | :baseDirFound
101 | set MAVEN_PROJECTBASEDIR=%WDIR%
102 | cd "%EXEC_DIR%"
103 | goto endDetectBaseDir
104 |
105 | :baseDirNotFound
106 | set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
107 | cd "%EXEC_DIR%"
108 |
109 | :endDetectBaseDir
110 |
111 | IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
112 |
113 | @setlocal EnableExtensions EnableDelayedExpansion
114 | for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
115 | @endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
116 |
117 | :endReadAdditionalConfig
118 |
119 | SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
120 |
121 | set WRAPPER_JAR=""%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar""
122 | set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
123 |
124 | %MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CMD_LINE_ARGS%
125 | if ERRORLEVEL 1 goto error
126 | goto end
127 |
128 | :error
129 | set ERROR_CODE=1
130 |
131 | :end
132 | @endlocal & set ERROR_CODE=%ERROR_CODE%
133 |
134 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
135 | @REM check for post script, once with legacy .bat ending and once with .cmd ending
136 | if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
137 | if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
138 | :skipRcPost
139 |
140 | @REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
141 | if "%MAVEN_BATCH_PAUSE%" == "on" pause
142 |
143 | if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
144 |
145 | exit /B %ERROR_CODE%
146 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.common/.gitignore:
--------------------------------------------------------------------------------
1 | common
2 | debugger
3 | ide
4 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.common/.project:
--------------------------------------------------------------------------------
1 |
2 |
3 | org.erlide.kernel.common
4 |
5 |
6 |
7 |
8 |
9 | org.eclipse.pde.ManifestBuilder
10 |
11 |
12 |
13 |
14 | org.eclipse.pde.SchemaBuilder
15 |
16 |
17 |
18 |
19 | org.eclipse.m2e.core.maven2Builder
20 |
21 |
22 |
23 |
24 |
25 | org.eclipse.m2e.core.maven2Nature
26 | org.eclipse.pde.PluginNature
27 |
28 |
29 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.common/.settings/org.eclipse.core.resources.prefs:
--------------------------------------------------------------------------------
1 | eclipse.preferences.version=1
2 | encoding/=UTF-8
3 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.common/.settings/org.eclipse.m2e.core.prefs:
--------------------------------------------------------------------------------
1 | activeProfiles=
2 | eclipse.preferences.version=1
3 | resolveWorkspaceProjects=true
4 | version=1
5 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.common/META-INF/MANIFEST.MF:
--------------------------------------------------------------------------------
1 | Manifest-Version: 1.0
2 | Bundle-ManifestVersion: 2
3 | Bundle-Name: Erlide Kernel
4 | Bundle-SymbolicName: org.erlide.kernel.common;singleton:=true
5 | Bundle-Version: 0.118.0.qualifier
6 | Bundle-Vendor: erlide.org project
7 | Bundle-RequiredExecutionEnvironment: JavaSE-1.6
8 | Eclipse-BundleShape: dir
9 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.common/build.properties:
--------------------------------------------------------------------------------
1 | bin.includes = META-INF/, ebin/, plugin.xml
2 | jars.compile.order = .
3 | source.. = /
4 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.common/plugin.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.common/pom.xml:
--------------------------------------------------------------------------------
1 |
2 | 4.0.0
3 |
4 | org.erlide
5 | org.erlide.kernel.parent
6 | 1.0.0
7 | ..
8 |
9 |
10 | org.erlide.kernel.common
11 | 0.118.0-SNAPSHOT
12 | eclipse-plugin
13 |
14 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.debugger/.gitignore:
--------------------------------------------------------------------------------
1 | common
2 | debugger
3 | ide
4 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.debugger/.project:
--------------------------------------------------------------------------------
1 |
2 |
3 | org.erlide.kernel.debugger
4 |
5 |
6 |
7 |
8 |
9 | org.eclipse.pde.ManifestBuilder
10 |
11 |
12 |
13 |
14 | org.eclipse.pde.SchemaBuilder
15 |
16 |
17 |
18 |
19 | org.eclipse.m2e.core.maven2Builder
20 |
21 |
22 |
23 |
24 |
25 | org.eclipse.m2e.core.maven2Nature
26 | org.eclipse.pde.PluginNature
27 |
28 |
29 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.debugger/.settings/org.eclipse.core.resources.prefs:
--------------------------------------------------------------------------------
1 | eclipse.preferences.version=1
2 | encoding/=UTF-8
3 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.debugger/.settings/org.eclipse.m2e.core.prefs:
--------------------------------------------------------------------------------
1 | activeProfiles=
2 | eclipse.preferences.version=1
3 | resolveWorkspaceProjects=true
4 | version=1
5 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.debugger/META-INF/MANIFEST.MF:
--------------------------------------------------------------------------------
1 | Manifest-Version: 1.0
2 | Bundle-ManifestVersion: 2
3 | Bundle-Name: Erlide Kernel
4 | Bundle-SymbolicName: org.erlide.kernel.debugger;singleton:=true
5 | Bundle-Version: 0.118.0.qualifier
6 | Bundle-Vendor: erlide.org project
7 | Bundle-RequiredExecutionEnvironment: JavaSE-1.6
8 | Eclipse-BundleShape: dir
9 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.debugger/build.properties:
--------------------------------------------------------------------------------
1 | bin.includes = META-INF/, ebin/, ebin/25/, ebin/26/, ebin/27/, plugin.xml
2 | jars.compile.order = .
3 | source.. = /
4 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.debugger/plugin.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
10 |
11 |
15 |
16 |
20 |
21 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.debugger/pom.xml:
--------------------------------------------------------------------------------
1 |
2 | 4.0.0
3 |
4 | org.erlide
5 | org.erlide.kernel.parent
6 | 1.0.0
7 | ..
8 |
9 |
10 | org.erlide.kernel.debugger
11 | 0.118.0-SNAPSHOT
12 | eclipse-plugin
13 |
14 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.feature/.project:
--------------------------------------------------------------------------------
1 |
2 |
3 | org.erlide.kernel.feature
4 |
5 |
6 |
7 |
8 |
9 | org.eclipse.pde.FeatureBuilder
10 |
11 |
12 |
13 |
14 | org.eclipse.m2e.core.maven2Builder
15 |
16 |
17 |
18 |
19 |
20 | org.eclipse.m2e.core.maven2Nature
21 | org.eclipse.pde.FeatureNature
22 |
23 |
24 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.feature/.settings/org.eclipse.core.resources.prefs:
--------------------------------------------------------------------------------
1 | eclipse.preferences.version=1
2 | encoding/=UTF-8
3 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.feature/.settings/org.eclipse.m2e.core.prefs:
--------------------------------------------------------------------------------
1 | activeProfiles=
2 | eclipse.preferences.version=1
3 | resolveWorkspaceProjects=true
4 | version=1
5 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.feature/.settings/org.eclipse.xtend.core.Xtend.prefs:
--------------------------------------------------------------------------------
1 | //outlet.DEFAULT_OUTPUT.sourceFolder.src/main/java.directory=xtend-gen
2 | //outlet.DEFAULT_OUTPUT.sourceFolder.src/test/java.directory=xtend-gen
3 | BuilderConfiguration.is_project_specific=true
4 | eclipse.preferences.version=1
5 | outlet.DEFAULT_OUTPUT.hideLocalSyntheticVariables=true
6 | outlet.DEFAULT_OUTPUT.installDslAsPrimarySource=false
7 | outlet.DEFAULT_OUTPUT.userOutputPerSourceFolder=true
8 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.feature/build.properties:
--------------------------------------------------------------------------------
1 | bin.includes = feature.xml,\
2 | feature.properties,\
3 | plugin_customization.ini
4 | src.includes = feature.xml,\
5 | .project,\
6 | build.properties,\
7 | feature.properties
8 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.feature/feature.properties:
--------------------------------------------------------------------------------
1 | vendorName=Erlide project
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.feature/feature.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
10 |
11 | Erlang implementation of the IDE support
12 |
13 |
14 |
15 | Copyright (c) 2004-2017 Vlad Dumitrescu, Jakob Cederlund, the
16 | Wrangler team and others.
17 | All rights reserved. Unless otherwise specified, this program
18 | and the accompanying materials are made available under the terms
19 | of the Eclipse Public License v1.0 which accompanies this distribution,
20 | and is available at http://www.eclipse.org/legal/epl-v10.html
21 |
22 |
23 |
24 | Eclipse Public License - v 1.0
25 | is available from http://www.eclipse.org/legal/epl-v10.html
26 |
27 |
28 |
29 |
30 |
31 |
32 |
37 |
38 |
43 |
44 |
49 |
50 |
51 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.feature/plugin_customization.ini:
--------------------------------------------------------------------------------
1 | org.eclipse.ui/SHOW_PROGRESS_ON_STARTUP = true
2 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.feature/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 |
8 | org.erlide
9 | org.erlide.kernel.parent
10 | 1.0.0
11 | ..
12 |
13 |
14 | org.erlide.kernel.feature
15 | 0.118.0-SNAPSHOT
16 | eclipse-feature
17 |
18 |
19 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.ide/.gitignore:
--------------------------------------------------------------------------------
1 | common
2 | debugger
3 | ide
4 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.ide/.project:
--------------------------------------------------------------------------------
1 |
2 |
3 | org.erlide.kernel.ide
4 |
5 |
6 |
7 |
8 |
9 | org.eclipse.pde.ManifestBuilder
10 |
11 |
12 |
13 |
14 | org.eclipse.pde.SchemaBuilder
15 |
16 |
17 |
18 |
19 | org.eclipse.m2e.core.maven2Builder
20 |
21 |
22 |
23 |
24 |
25 | org.eclipse.m2e.core.maven2Nature
26 | org.eclipse.pde.PluginNature
27 |
28 |
29 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.ide/.settings/org.eclipse.core.resources.prefs:
--------------------------------------------------------------------------------
1 | eclipse.preferences.version=1
2 | encoding/=UTF-8
3 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.ide/.settings/org.eclipse.m2e.core.prefs:
--------------------------------------------------------------------------------
1 | activeProfiles=
2 | eclipse.preferences.version=1
3 | resolveWorkspaceProjects=true
4 | version=1
5 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.ide/META-INF/MANIFEST.MF:
--------------------------------------------------------------------------------
1 | Manifest-Version: 1.0
2 | Bundle-ManifestVersion: 2
3 | Bundle-Name: Erlide Kernel
4 | Bundle-SymbolicName: org.erlide.kernel.ide;singleton:=true
5 | Bundle-Version: 0.118.0.qualifier
6 | Bundle-Vendor: erlide.org project
7 | Bundle-RequiredExecutionEnvironment: JavaSE-1.6
8 | Eclipse-BundleShape: dir
9 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.ide/build.properties:
--------------------------------------------------------------------------------
1 | bin.includes = META-INF/, ebin/, plugin.xml
2 | jars.compile.order = .
3 | source.. = /
4 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.ide/plugin.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.ide/pom.xml:
--------------------------------------------------------------------------------
1 |
2 | 4.0.0
3 |
4 | org.erlide
5 | org.erlide.kernel.parent
6 | 1.0.0
7 | ..
8 |
9 |
10 | org.erlide.kernel.ide
11 | 0.118.0-SNAPSHOT
12 | eclipse-plugin
13 |
14 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.site/.project:
--------------------------------------------------------------------------------
1 |
2 |
3 | org.erlide.kernel.site
4 |
5 |
6 |
7 |
8 |
9 | org.eclipse.m2e.core.maven2Builder
10 |
11 |
12 |
13 |
14 |
15 | org.eclipse.m2e.core.maven2Nature
16 |
17 |
18 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.site/.settings/org.eclipse.core.resources.prefs:
--------------------------------------------------------------------------------
1 | eclipse.preferences.version=1
2 | encoding/=UTF-8
3 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.site/category.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.site/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 |
8 | org.erlide
9 | org.erlide.kernel.parent
10 | 1.0.0
11 | ..
12 |
13 |
14 | org.erlide.kernel.site
15 | eclipse-repository
16 | 0.118.0-SNAPSHOT
17 |
18 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.target/.project:
--------------------------------------------------------------------------------
1 |
2 |
3 | org.erlide.kernel.target
4 |
5 |
6 |
7 |
8 |
9 | org.eclipse.m2e.core.maven2Builder
10 |
11 |
12 |
13 |
14 |
15 | org.eclipse.m2e.core.maven2Nature
16 |
17 |
18 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.target/.settings/org.eclipse.core.resources.prefs:
--------------------------------------------------------------------------------
1 | eclipse.preferences.version=1
2 | encoding/=UTF-8
3 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.target/.settings/org.eclipse.m2e.core.prefs:
--------------------------------------------------------------------------------
1 | activeProfiles=
2 | eclipse.preferences.version=1
3 | resolveWorkspaceProjects=true
4 | version=1
5 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.target/org.erlide.kernel.target.target:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/eclipse/org.erlide.kernel.target/pom.xml:
--------------------------------------------------------------------------------
1 |
2 | 4.0.0
3 |
4 |
5 | org.erlide
6 | org.erlide.kernel.parent
7 | 1.0.0
8 | ..
9 |
10 |
11 | org.erlide.kernel.target
12 | eclipse-target-definition
13 |
14 |
--------------------------------------------------------------------------------
/eclipse/publish:
--------------------------------------------------------------------------------
1 | #!/bin/bash -e
2 | # This script will publish a built erlide_kernel plugin to
3 | # the update site repository.
4 | #
5 | # The plugin files will be extracted to:
6 | # /update/kernel//
7 | #
8 | repo=${repo:-erlide/erlide.github.io}
9 |
10 | # Get the plugin version from feature.xml
11 | source ../build_utils.sh
12 | version=`get_feature_vsn org.erlide.kernel.feature`
13 |
14 | echo "Publishing version ${version} to repository ${repo}.."
15 | echo
16 | read -p "Press enter to continue..."
17 |
18 | # Clone the destination repo for the update site
19 | tmp_dir="/tmp/${repo}"
20 | rm -rf ${tmp_dir}
21 | git clone --depth 1 git@github.com:${repo} ${tmp_dir}
22 |
23 | # Extract the Eclipse plugin package to the update site
24 | dest_dir="${tmp_dir}/update/kernel/${version}"
25 | mkdir -p ${dest_dir}
26 | unzip -o org.erlide.kernel.site-${version}.zip -d ${dest_dir}
27 |
28 | # Push the new plugin to the update site repo
29 | cd ${dest_dir}
30 | git add .
31 | git commit -a -m "Publish erlide_kernel ${version}"
32 | git push origin master
33 |
--------------------------------------------------------------------------------
/ide/apps/erlide_ide/.project:
--------------------------------------------------------------------------------
1 |
2 |
3 | erlide_ide
4 |
5 |
6 | erlide_common
7 | erlide_server
8 |
9 |
10 |
11 | org.erlide.core.erlbuilder
12 |
13 |
14 |
15 |
16 |
17 | org.erlide.core.erlnature
18 |
19 |
20 |
--------------------------------------------------------------------------------
/ide/apps/erlide_ide/.settings/org.eclipse.core.resources.prefs:
--------------------------------------------------------------------------------
1 | eclipse.preferences.version=1
2 | encoding/=ISO-8859-1
3 |
--------------------------------------------------------------------------------
/ide/apps/erlide_ide/.settings/org.erlide.core.prefs:
--------------------------------------------------------------------------------
1 | backend_version=19.0
2 | compiler/warn_deprecated_function=true
3 | compiler/warn_export_all=true
4 | compiler/warn_export_vars=true
5 | compiler/warn_obsolete_guard=true
6 | compiler/warn_shadow_vars=true
7 | compiler/warn_unused_function=true
8 | compiler/warn_unused_import=true
9 | compiler/warn_unused_record=true
10 | compiler/warn_unused_vars=true
11 | eclipse.preferences.version=1
12 | external_includes=
13 | external_modules=
14 | include_dirs=include;
15 | output_dir=ebin
16 | source_dirs=src;
17 | use_pathz=false
18 |
--------------------------------------------------------------------------------
/ide/apps/erlide_ide/.settings/org.erlide.model.prefs:
--------------------------------------------------------------------------------
1 | builderData=INTERNAL|compile|clean|test|
2 | configType=INTERNAL
3 | eclipse.preferences.version=1
4 |
--------------------------------------------------------------------------------
/ide/apps/erlide_ide/data/test_unicode.erl:
--------------------------------------------------------------------------------
1 | %% coding: utf-8
2 | -module(test_unicode).
3 | %%
4 | %% 人不知而不慍,不亦君子乎?」
5 | %%
6 | %% 生むぎ 生ごめ 生たまご
7 | %%
8 | %% советских военных судов и самолетов была
9 | %%
10 | %% Աեցեհի իմ լավ ?ւղիե լավարար,
11 | %%
12 | %% Yukarda mavi gök, asağıda yağız yer yaratıldıkta
13 | %%
14 | start("謀", $為) ->
15 | "為人謀而不忠乎",
16 | $為,
17 | ok.
18 |
19 | stop()->
20 | ok.
21 |
22 |
--------------------------------------------------------------------------------
/ide/apps/erlide_ide/include/erlide_open.hrl:
--------------------------------------------------------------------------------
1 |
2 | -record(open_context, {externalModules=[],
3 | externalIncludes=[],
4 | pathVars=[],
5 | extraSourcePaths=[],
6 | imports=[]}).
7 |
--------------------------------------------------------------------------------
/ide/apps/erlide_ide/priv/.keep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erlang/erlide_kernel/ba61079066c495ad22f4da52da294cf0f97d489f/ide/apps/erlide_ide/priv/.keep
--------------------------------------------------------------------------------
/ide/apps/erlide_ide/src/erlide_comment.erl:
--------------------------------------------------------------------------------
1 | %% Author: jakob
2 | %% Created: Mar 23, 2006
3 |
4 | -module(erlide_comment).
5 |
6 | %%
7 | %% Include files
8 | %%
9 |
10 | %%
11 | %% Exported Functions
12 | %%
13 | -export([toggle_comment/3]).
14 |
15 | %-define(DEBUG, 1). %
16 |
17 | -include_lib("erlide_common/include/erlide_dbglog.hrl").
18 |
19 | %%
20 | %% API Functions
21 | %%
22 |
23 | toggle_comment(Text, From, Length) ->
24 | ?D({Text, From, Length}),
25 | {_, _, Lines} = erlide_text:get_text_and_lines(Text, From, Length),
26 | ?D(Lines),
27 | LineF = case lists:all(fun(L) -> is_comment_line(L) end, Lines) of
28 | true ->
29 | fun(L) -> uncomment_line(L) end;
30 | false ->
31 | fun(L) -> comment_line(L) end
32 | end,
33 | lists:flatten(lists:map(LineF, Lines)).
34 |
35 | %%
36 | %% Local Functions
37 | %%
38 |
39 | is_comment_line("") -> false;
40 | is_comment_line(" " ++ Rest) -> is_comment_line(Rest);
41 | is_comment_line("\t" ++ Rest) -> is_comment_line(Rest);
42 | is_comment_line("%" ++ _) -> true;
43 | is_comment_line(_) -> false.
44 |
45 | uncomment_line(Line) -> uncomment_line_x(Line).
46 |
47 | uncomment_line_x("%% " ++ Rest) -> Rest;
48 | uncomment_line_x("%%" ++ Rest) -> Rest;
49 | uncomment_line_x("%" ++ Rest) -> Rest;
50 | uncomment_line_x(" " ++ Rest) -> uncomment_line_x(Rest);
51 | uncomment_line_x(Line) -> Line.
52 |
53 | comment_line("") -> "";
54 | comment_line(Line) -> ["%% ", Line].
55 |
--------------------------------------------------------------------------------
/ide/apps/erlide_ide/src/erlide_ide.app.src:
--------------------------------------------------------------------------------
1 | {application, erlide_ide,
2 | [
3 | {description,"erlide_ide"},
4 | {vsn, "0.118.0"},
5 | {erlide_context, ide},
6 | {registered, []},
7 | {applications, [kernel, stdlib, erlide_common, erlide_ide_core]},
8 | {env, []}
9 | ]}
10 | .
11 |
--------------------------------------------------------------------------------
/ide/apps/erlide_ide/src/erlide_model.erl:
--------------------------------------------------------------------------------
1 | -module(erlide_model).
2 |
3 | -export([
4 | init/2,
5 | change_configuration/2,
6 | open_document/5,
7 | change_document/4,
8 | save_document/2,
9 | close_document/2,
10 | change_watched_files/2
11 | ]).
12 |
13 | -type path_item() :: {'lib'|'app'|'file', string()}.
14 |
15 | -type state() :: #{
16 | 'workspace' => string(),
17 | 'open_documents' => [any()],
18 | 'code_path' => [path_item()],
19 | 'logger' => atom(),
20 | 'files' => [{string(), boolean()}],
21 | 'parser' => fun((string()) -> any())
22 | }.
23 |
24 | %-define(LOG(X), State#state.logger:log(X)).
25 | -define(LOG(X), io:format("~p~n", [X])).
26 |
27 | -spec init(string(), atom()) -> {'ok', state()} | {'error', any()}.
28 | init(Workspace, Logger) ->
29 | State = #{
30 | files => [],
31 | parser => fun parse_file/1
32 | },
33 | change_configuration(State, [
34 | {workspace, Workspace},
35 | {logger, Logger}
36 | ]).
37 |
38 | -spec change_configuration(state(), [{atom(), any()}]) ->
39 | {'ok', state()} | {'error', any()}.
40 | change_configuration(State, Settings) ->
41 | NewState = maps:merge(State, maps:from_list(Settings)),
42 | ?LOG({change_configuration, State, NewState}),
43 | {ok, NewState}.
44 |
45 | -spec open_document(state(), string(), atom(), integer(), iolist()) ->
46 | {'ok', state()} | {'error', any()}.
47 | open_document(State, _Uri, _LangId, _Version, _Text) ->
48 | NewState = State,
49 | ?LOG({open_document, State, NewState}),
50 | {ok, NewState}.
51 |
52 | -spec change_document(state(), erlide_lsp_server:text_document_id(), integer(), [erlide_lsp_server:content_change()]) ->
53 | {'ok', state()} | {'error', any()}.
54 | change_document(State, _DocumentId, _Version, _Changes) ->
55 | NewState = State,
56 | ?LOG({change_document, State, NewState}),
57 | {ok, State}.
58 |
59 | -spec close_document(state(), erlide_lsp_server:text_document_id()) ->
60 | {'ok', state()} | {'error', any()}.
61 | close_document(State, _DocumentId) ->
62 | NewState = State,
63 | ?LOG({close_document, State, NewState}),
64 | {ok, State}.
65 |
66 | -spec save_document(state(), erlide_lsp_server:text_document_id()) ->
67 | {'ok', state()} | {'error', any()}.
68 | save_document(State, _DocumentId) ->
69 | NewState = State,
70 | ?LOG({save_document, State, NewState}),
71 | {ok, State}.
72 |
73 | -spec change_watched_files(state(), [erlide_lsp_server:file_event()]) ->
74 | {'ok', state()} | {'error', any()}.
75 | change_watched_files(State=#{files:=Files, parser:=Parser}, FileEvents) ->
76 | NewFiles = lists:foldl(fun update_file_change/2, Files, FileEvents),
77 | NewFiles1 = lists:map(parse(Parser), NewFiles),
78 | NewState = State#{files=>NewFiles1},
79 | ?LOG({change_watched_files, State, NewState}),
80 | {ok, NewState}.
81 |
82 | %%%%%%%%%%%%%%%%%%%
83 |
84 | update_file_change({File, created}, Files) ->
85 | update_file_change({File, changed}, Files);
86 | update_file_change({File, changed}, Files) ->
87 | NewFiles0 = lists:keydelete(File, 1, Files),
88 | NewFiles = [{File, true} | NewFiles0],
89 | NewFiles;
90 | update_file_change({File, deleted}, Files) ->
91 | NewFiles = lists:keydelete(File, 1, Files),
92 | NewFiles.
93 |
94 | parse(Parser) ->
95 | fun({File, false}) ->
96 | {File, false};
97 | ({File, true}) ->
98 | spawn(fun()->Parser(File) end),
99 | {File, false}
100 | end.
101 |
102 | parse_file(_File) ->
103 | ok.
104 |
105 |
--------------------------------------------------------------------------------
/ide/apps/erlide_ide/src/erlide_search.erl:
--------------------------------------------------------------------------------
1 | %% @author jakob
2 | %% the functional part of searching
3 |
4 | -module(erlide_search).
5 |
6 | %%
7 | %% Include files
8 | %%
9 |
10 | %% -define(DEBUG, 1).
11 |
12 | -include_lib("erlide_common/include/erlide_dbglog.hrl").
13 |
14 | -include_lib("erlide_ide_core/include/erlide_search.hrl").
15 |
16 | %%
17 | %% Exported Functions
18 | %%
19 |
20 | -export([find_data/4]).
21 |
22 | %%
23 | %% API Functions
24 | %%
25 |
26 | find_data(Refs, Pattern, ModuleAtom, ModuleName) ->
27 | find_data(Refs, Pattern, ModuleAtom, ModuleName, []).
28 |
29 | %%
30 | %% Local Functions
31 | %%
32 |
33 | find_data([], _, _, _, Acc) ->
34 | Acc;
35 | find_data([#ref{function=F, arity=A, clause=C, data=D, offset=O, length=L, sub_clause=S} | Rest],
36 | Pattern, Mod, M, Acc) ->
37 | NewAcc = case check_pattern(Pattern, Mod, D, F, A, C) of
38 | true ->
39 | [{M, F, A, C, S, O, L, is_def(D)} | Acc];
40 | false ->
41 | Acc
42 | end,
43 | find_data(Rest, Pattern, Mod, M, NewAcc).
44 |
45 | %% is_def(Ref) returns true if the ref is a definition
46 | is_def(#function_def{}) -> true;
47 | is_def(#macro_def{}) -> true;
48 | is_def(#type_def{}) -> true;
49 | is_def(#module_def{}) -> true;
50 | is_def(#var_def{}) -> true;
51 | is_def(#record_field_def{}) -> true;
52 | is_def(_) -> false.
53 |
54 | check_pattern(Pattern, Mod, #local_call{function=F, arity=A}, _, _, _)->
55 | check_function_ref(#external_call{module=Mod, function=F, arity=A}, Pattern);
56 | check_pattern(Pattern, Mod, #function_def{function=F, arity=A} = FD, _, _, _)->
57 | check_function_ref(FD, Pattern) orelse
58 | check_function_ref(#function_def_mod{module=Mod, function=F, arity=A}, Pattern);
59 | check_pattern(Pattern, Mod, #type_ref{module='_', type=T}, _, _, _) ->
60 | lists:member(#type_ref{module=Mod, type=T}, Pattern);
61 | check_pattern(Pattern, _Mod, #var_ref{}=VR, F, A, C) ->
62 | check_var_pattern(Pattern, VR, F, A, C);
63 | check_pattern(Pattern, _Mod, #var_def{}=VD, F, A, C) ->
64 | check_var_pattern(Pattern, VD, F, A, C);
65 | check_pattern(Pattern, _Mod, D, _, _, _) ->
66 | lists:member(D, Pattern).
67 |
68 | check_function_ref(_, []) ->
69 | false;
70 | check_function_ref(#external_call{module=Mod, function=F, arity=A1}, [#external_call{module=Mod, function=F, arity=A2}|_]) ->
71 | A1==A2 orelse A2==undefined;
72 | check_function_ref(#function_def{function=F, arity=A1}, [#function_def{function=F, arity=A2}|_]) ->
73 | A1==A2 orelse A2==undefined;
74 | check_function_ref(#function_def_mod{module=Mod, function=F, arity=A1}, [#function_def_mod{module=Mod, function=F, arity=A2}|_]) ->
75 | A1==A2 orelse A2==undefined;
76 | check_function_ref(X, [_|Tail]) ->
77 | check_function_ref(X, Tail).
78 |
79 |
80 |
81 | check_var_pattern([], _, _, _, _) ->
82 | false;
83 | check_var_pattern([#var_pattern{vardefref=VL, function=F, arity=A, clause=C} | Rest], V, F, A, C) ->
84 | ?D({VL, F, A, C}),
85 | case lists:member(V, VL) of
86 | true -> true;
87 | false -> check_var_pattern(Rest, V, F, A, C)
88 | end;
89 | check_var_pattern([#var_pattern{vardefref=VL, function='', arity=-1, clause=""} | Rest], V, F, A, C) ->
90 | ?D({VL, F, A, C}),
91 | case lists:member(V, VL) of
92 | true -> true;
93 | false -> check_var_pattern(Rest, V, F, A, C)
94 | end;
95 | check_var_pattern([_ | Rest], V, F, A, C) ->
96 | check_var_pattern(Rest, V, F, A, C).
97 |
--------------------------------------------------------------------------------
/ide/apps/erlide_ide/src/erlide_xref.erl:
--------------------------------------------------------------------------------
1 | -module(erlide_xref).
2 |
3 | -export([start/0,
4 | stop/0,
5 | add_project/1,
6 | add_dirs/1,
7 | analyze/1,
8 | function_call/1,
9 | function_use/1,
10 | function_call/3,
11 | function_use/3,
12 | modules/0,
13 | module_call/1,
14 | module_use/1,
15 | update/0]).
16 |
17 | %-define(DEBUG, 1).
18 |
19 | -define(XREF, erlide_xref).
20 |
21 |
22 | -include_lib("erlide_common/include/erlide_dbglog.hrl").
23 |
24 | start() ->
25 | start(whereis(?XREF)).
26 |
27 | start(undefined) ->
28 | %% spawn(fun() ->
29 | erlang:process_flag(save_calls, 50),
30 | erlang:yield(),
31 | xref:start(?XREF),
32 | xref:set_default(?XREF, [{verbose,false},{warnings,false}]),
33 | %% X= xref:add_release(erlide, code:lib_dir(),
34 | %% [{name, otp}]),
35 | %% ok
36 | %% end),
37 | ok;
38 | start(_) ->
39 | ok.
40 |
41 | stop() ->
42 | xref:stop(?XREF).
43 |
44 | add_project(ProjectDir) ->
45 | R=xref:add_application(?XREF, ProjectDir),
46 | R.
47 |
48 | add_dirs([]) ->
49 | ok;
50 | add_dirs([BeamDir | Rest]) ->
51 | start(),
52 | update(),
53 | ?D(BeamDir),
54 | case xref:add_directory(?XREF, BeamDir, [{recurse, false}]) of
55 | {ok, _} = _R ->
56 | ?D(_R),
57 | add_dirs(Rest);
58 | {error, xref_base, {module_clash, _}} ->
59 | add_dirs(Rest);
60 | Error ->
61 | ?D(Error),
62 | Error
63 | end.
64 |
65 | %% add_dir(BeamDir) ->
66 | %% start(),
67 | %% R = xref:add_directory(?XREF, BeamDir),
68 | %% ?D(R),
69 | %% R.
70 |
71 | update() ->
72 | start(),
73 | xref:update(?XREF, []).
74 |
75 | modules() ->
76 | start(),
77 | xref:q(?XREF, "M").
78 |
79 | analyze(Module) when is_atom(Module) ->
80 | start(),
81 | xref:m(Module);
82 | analyze(Dir) when is_list(Dir) ->
83 | start(),
84 | xref:d(Dir).
85 |
86 | module_use(Module) when is_atom(Module) ->
87 | start(),
88 | xref:analyze(?XREF, {module_use, Module}).
89 |
90 | module_call(Module) when is_atom(Module) ->
91 | start(),
92 | xref:analyze(?XREF, {module_call, Module}).
93 |
94 | function_use({M, F, A}) when is_atom(M), is_atom(F), is_integer(A) ->
95 | start(),
96 | xref:analyze(?XREF, {use, [{M, F, A}]}, []).
97 |
98 | function_use(M, F, A) ->
99 | function_use({M, F, A}).
100 |
101 | function_call({M, F, A}) when is_atom(M), is_atom(F), is_integer(A) ->
102 | xref:analyze(?XREF, {call, {M, F, A}}).
103 |
104 | function_call(M, F, A) when is_atom(M), is_atom(F), is_integer(A) ->
105 | xref:analyze(?XREF, {call, {M, F, A}}).
106 |
--------------------------------------------------------------------------------
/ide/apps/erlide_ide/test/erlide_open_tests.erl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erlang/erlide_kernel/ba61079066c495ad22f4da52da294cf0f97d489f/ide/apps/erlide_ide/test/erlide_open_tests.erl
--------------------------------------------------------------------------------
/ide/apps/erlide_ide/test/erlide_search_tests.erl:
--------------------------------------------------------------------------------
1 | %% Author: jakob
2 | %% Created: 20 dec 2010
3 | -module(erlide_search_tests).
4 |
5 | %%
6 | %% Include files
7 | %%
8 |
9 | -include_lib("eunit/include/eunit.hrl").
10 |
11 | %%
12 | %% Exported Functions
13 | %%
14 |
15 | -define(ARI_TYPESPEC, -2).
16 | -define(ARI_ATTRIBUTE, -3).
17 | -define(ARI_RECORD_DEF, -4).
18 | -define(ARI_MACRO_DEF, -5).
19 | -define(ARI_INCLUDE, -6).
20 | -define(ARI_RECORD_FIELD_DEF, -7).
21 |
22 | record_ref_within_type_spec_test_() ->
23 | S = "-record(a, {b, c :: #rec{}}).",
24 | Expected = [{"xxx", a, ?ARI_RECORD_DEF, [], false, 20, 4, false}],
25 | Value = test_refs(S, {record_ref, rec}),
26 | [?_assertEqual(Expected, Value)].
27 |
28 | record_field_ref_test_() ->
29 | S = "f() -> #record{a=ok}, #record.a.",
30 | Expected = [{"xxx",f,0,[],false,30,1,false},
31 | {"xxx", f, 0, [], false, 15, 1, false}],
32 | Value = test_refs(S, {record_field_ref, record, a}),
33 | [?_assertEqual(Expected, Value)].
34 |
35 | external_call_after_record_dot_field_test_() ->
36 | S = "f() ->\n #a.b,\n a:f().\n",
37 | Expected = [{"xxx", f, 0, [], false, 21, 3, false}],
38 | Value = test_refs(S, {external_call, a, f, 0}),
39 | [?_assertEqual(Expected, Value)].
40 |
41 | local_call_in_record_test_() ->
42 | S = "a() ->\n y(),\n A#b{x = y()}.\n",
43 | Expected = [{"xxx", a, 0, [], false, 11, 1, false},
44 | {"xxx", a, 0, [], false, 28, 1, false}],
45 | Value = test_refs(S, {external_call, xxx, y, 0}),
46 | [?_assertEqual(Expected, Value)].
47 |
48 | external_call_after_empty_record_test_() ->
49 | S = "f() ->\n #x{},\n a:f().\n",
50 | Expected1 = [{"xxx", f, 0, [], false, 21, 3, false}],
51 | Value1 = test_refs(S, {external_call, a, f, 0}),
52 | Expected2 = [{"xxx", f, 0, [], false, 11, 2, false}],
53 | Value2 = test_refs(S, {record_ref, x}),
54 | [?_assertEqual(Expected1, Value1),
55 | ?_assertEqual(Expected2, Value2)].
56 |
57 | find_second_field_in_record_match_test_() ->
58 | %% http://www.assembla.com/spaces/erlide/tickets/1268-searching---can-t-find-fields-in-record-match---construction
59 | S = "x(A, B) ->\n #r{field1=A, field2=B}.",
60 | Value = test_refs(S, {record_field_ref, r, field2}),
61 | Expected = [{"xxx",x,2,"(A, B)",false,28,6,false}],
62 | [?_assertEqual(Expected, Value)].
63 |
64 |
65 | %%
66 | %% Local Functions
67 | %%
68 |
69 | test_refs(S, SearchPattern) ->
70 | {ok, Tokens, _EndPos} = erlide_scan:string(S),
71 | {_Forms, _Comments, Refs} = erlide_np:parse(Tokens),
72 | erlide_search:find_data(Refs, [SearchPattern], xxx, "xxx").
73 |
--------------------------------------------------------------------------------
/ide/apps/erlide_ide_core/.project:
--------------------------------------------------------------------------------
1 |
2 |
3 | erlide_ide_core
4 |
5 |
6 | erlide_common
7 |
8 |
9 |
10 | org.erlide.core.erlbuilder
11 |
12 |
13 |
14 |
15 |
16 | org.erlide.core.erlnature
17 |
18 |
19 |
--------------------------------------------------------------------------------
/ide/apps/erlide_ide_core/.settings/org.eclipse.core.resources.prefs:
--------------------------------------------------------------------------------
1 | encoding//src/erl_scan_local.erl=UTF-8
2 | eclipse.preferences.version=1
3 | encoding/=ISO-8859-1
4 |
--------------------------------------------------------------------------------
/ide/apps/erlide_ide_core/.settings/org.erlide.core.prefs:
--------------------------------------------------------------------------------
1 | backend_version=19.0
2 | eclipse.preferences.version=1
3 | external_includes=
4 | external_modules=
5 | include_dirs=include;
6 | output_dir=ebin
7 | source_dirs=src;
8 |
--------------------------------------------------------------------------------
/ide/apps/erlide_ide_core/.settings/org.erlide.model.prefs:
--------------------------------------------------------------------------------
1 | builderData=INTERNAL|compile|clean|test|
2 | configType=INTERNAL
3 | eclipse.preferences.version=1
4 |
--------------------------------------------------------------------------------
/ide/apps/erlide_ide_core/include/erlide_noparse.hrl:
--------------------------------------------------------------------------------
1 |
2 | -record(model, {forms, comments}).
3 |
4 | -type model() :: #model{}.
5 |
6 | -type pos() :: {{Line::integer(), LastLine::integer(), Offset::integer()}, PosLength::integer()}.
7 |
8 | -record(function, {pos::pos(), name::atom(), arity::integer(), args, head, clauses, name_pos, exported}).
9 | -record(clause, {pos::pos(), name::atom(), args, head, name_pos}).
10 | -record(attribute, {pos::pos(), name::atom(), args, extra, arity}).
11 | -record(other, {pos::pos(), name::atom(), tokens}).
12 |
--------------------------------------------------------------------------------
/ide/apps/erlide_ide_core/include/erlide_scanner_server.hrl:
--------------------------------------------------------------------------------
1 | -record(module, {name,
2 | lines = [], % [{Length, String}]
3 | tokens = [] % [{Length, [Token]}]
4 | }).
5 |
--------------------------------------------------------------------------------
/ide/apps/erlide_ide_core/include/erlide_search.hrl:
--------------------------------------------------------------------------------
1 | %% Description: References used for searches, generated by erlide_noparse
2 | %% Author: jakob (jakobce at g mail dot com)
3 | %% Created: 21 mar 2010
4 |
5 | -record(ref, {data, offset, length, function, arity, clause, sub_clause}).
6 |
7 | -record(external_call, {module, function, arity}).
8 | -record(local_call, {function, arity}).
9 | -record(function_def, {function, arity}).
10 | -record(function_def_mod, {module, function, arity}).
11 | -record(include_ref, {filename}).
12 | -record(macro_ref, {name}).
13 | -record(record_ref, {name}).
14 | -record(macro_def, {name}).
15 | -record(record_def, {name}).
16 | -record(type_ref, {module, type}).
17 | -record(type_def, {type}).
18 | -record(module_def, {name}).
19 | -record(var_def, {name}).
20 | -record(var_ref, {name}).
21 | -record(var_pattern, {vardefref, function, arity, clause}).
22 | -record(record_field_def, {record, name}).
23 | -record(record_field_ref, {record, name}).
24 |
--------------------------------------------------------------------------------
/ide/apps/erlide_ide_core/include/erlide_token.hrl:
--------------------------------------------------------------------------------
1 |
2 | -record(token, {kind=u, line=u, offset=u, length=u, value=u, text=u, last_line=u, column=u}).
3 | %% IMPORTANT: changing this means ErlParser needs to be updated
4 | %% new fields can be added at the end
5 |
6 | -type token() :: #token{}.
7 |
--------------------------------------------------------------------------------
/ide/apps/erlide_ide_core/priv/.keep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erlang/erlide_kernel/ba61079066c495ad22f4da52da294cf0f97d489f/ide/apps/erlide_ide_core/priv/.keep
--------------------------------------------------------------------------------
/ide/apps/erlide_ide_core/src/erlide_cache.erl:
--------------------------------------------------------------------------------
1 | -module(erlide_cache).
2 |
3 | -include_lib("erlide_common/include/erlide_dbglog.hrl").
4 | -include_lib("kernel/include/file.hrl").
5 |
6 | -export([
7 | check_and_renew_cached/5
8 | ]).
9 |
10 | -type date() :: {{1900..2038, 1..12, 1..31}, {0..24, 0..59, 0..59}}.
11 | -define(NO_DATE, {{1900, 1, 1}, {0, 0, 0}}).
12 |
13 | -spec check_and_renew_cached(file:name_all(), file:name_all(), non_neg_integer(),
14 | fun((any()) -> any()), boolean()) -> {'cached'|'renewed'|'dont_use_cache', any()}.
15 |
16 | check_and_renew_cached(SourceFileName, _CacheFileName, _Version, RenewFun, false) ->
17 | Term = RenewFun(SourceFileName),
18 | {dont_use_cache, Term};
19 | check_and_renew_cached(SourceFileName, CacheFileName, Version, RenewFun, true) ->
20 | ?D(check_and_renew_cached),
21 | case check_cached(SourceFileName, CacheFileName, Version) of
22 | {cache, Cached} ->
23 | ?D({from_cache, CacheFileName}),
24 | R = {cached, Cached},
25 | ?D(got_cached),
26 | R;
27 | {no_cache, SourceModDate} ->
28 | ?D(SourceModDate),
29 | Term = RenewFun(SourceFileName),
30 | ?D({renewing, CacheFileName}),
31 | write_cache(SourceModDate, Version, CacheFileName, Term),
32 | {renewed, Term}
33 | end.
34 |
35 | -spec read_cache_date_and_version(string()) -> {date(), integer()}.
36 | read_cache_date_and_version(CacheFileName) ->
37 | ?D("check "++CacheFileName),
38 | case file:open(CacheFileName, [read, binary]) of
39 | {ok, F} ->
40 | {ok, BinDateAndVersion} = file:read(F, 7),
41 | file:close(F),
42 | <> = BinDateAndVersion,
43 | {bin_to_date(BinDate), Version};
44 | _Err ->
45 | {?NO_DATE, 0}
46 | end.
47 |
48 | check_cached(none, CacheFileName, Version) ->
49 | ?D(CacheFileName),
50 | SourceModDate = ?NO_DATE,
51 | check_cached_aux(SourceModDate, CacheFileName, Version);
52 | check_cached(SourceFileName, CacheFileName, Version) ->
53 | ?D({SourceFileName, CacheFileName}),
54 | SourceModDate = case file:read_file_info(SourceFileName) of
55 | {ok, Info} ->
56 | Info#file_info.mtime;
57 | {error, enoent} ->
58 | ?NO_DATE
59 | end,
60 | ?D(SourceModDate),
61 | check_cached_aux(SourceModDate, CacheFileName, Version).
62 |
63 | check_cached_aux(SourceModDate, CacheFileName, Version) ->
64 | ?D({SourceModDate, CacheFileName, Version}),
65 | SV = read_cache_date_and_version(CacheFileName),
66 | ?D(SV),
67 | case same_date_and_version(SV, {SourceModDate, Version}) of
68 | true ->
69 | {cache, read_cache(CacheFileName)};
70 | _ ->
71 | {no_cache, SourceModDate}
72 | end.
73 |
74 | same_date_and_version({{Date, {H, M, S1}}, V}, {{Date, {H, M, S2}}, V}) ->
75 | S1 div 2 =:= S2 div 2;
76 | same_date_and_version(_, _) ->
77 | false.
78 |
79 | %% renew_cached(SourceFileName, CacheFileName, Version, Term) ->
80 | %% SourceModDate = case file:read_file_info(SourceFileName) of
81 | %% {ok, Info} ->
82 | %% Info#file_info.mtime;
83 | %% {error, enoent} ->
84 | %% {{1900, 1, 1}, {0, 0, 0}}
85 | %% end,
86 | %% ?D(SourceFileName),
87 | %% renew_cache(SourceModDate, Version, CacheFileName, Term).
88 |
89 | read_cache(CacheFileName) ->
90 | {ok, B} = file:read_file(CacheFileName),
91 | ?D(CacheFileName),
92 | <<_:5/binary, _:16/integer-big, BinTerm/binary>> = B,
93 | binary_to_term(BinTerm).
94 |
95 | -spec bin_to_date(binary()) -> date().
96 | bin_to_date(<>) ->
97 | {{Y, Mo, D}, {H, M, S*2}}.
98 |
99 | -spec date_to_bin(date()) -> binary().
100 | date_to_bin({{Y, Mo, D}, {H, M, S}}) ->
101 | <>.
102 |
103 | -spec write_cache(date(), non_neg_integer(), file:name_all(), any()) -> 'ok'.
104 | write_cache(SourceFileModDate, Version, CacheFileName, Term) ->
105 | ?D({write, CacheFileName, SourceFileModDate, Version}),
106 | BinDate = date_to_bin(SourceFileModDate),
107 | B = term_to_binary(Term, [compressed]),
108 | _Delete = file:delete(CacheFileName),
109 | touch_path(CacheFileName),
110 | _Write = file:write_file(CacheFileName, <>),
111 | ?D(_Write).
112 |
113 | touch_path(Path) ->
114 | touch_path(filename:split(Path), []).
115 |
116 | touch_path([], _) ->
117 | ok;
118 | touch_path([_], _) ->
119 | ok;
120 | touch_path([H|T], Acc) ->
121 | Crt = filename:join(Acc, H),
122 | _Err = file:make_dir(Crt),
123 | touch_path(T, Crt).
124 |
125 |
--------------------------------------------------------------------------------
/ide/apps/erlide_ide_core/src/erlide_ide_core.app.src:
--------------------------------------------------------------------------------
1 | {application, erlide_ide_core,
2 | [
3 | {description,"erlide_ide_core"},
4 | {vsn, "0.118.0"},
5 | {erlide_context, ide},
6 | {registered, []},
7 | {applications, [kernel, stdlib, erlide_common]},
8 | {env, []}
9 | ]}
10 | .
11 |
--------------------------------------------------------------------------------
/ide/apps/erlide_ide_core/src/erlide_noparse.erl:
--------------------------------------------------------------------------------
1 | %% Description: Split source files into functions and clauses and collects references
2 | %% Author: jakob
3 | %% Created: Mar 23, 2006
4 |
5 | -module(erlide_noparse).
6 |
7 | %%
8 | %% Exported Functions
9 | %%
10 |
11 | %% called from Java
12 | -export([initial_parse/6, reparse/2, remove_cache_files/2]).
13 |
14 | %% called from Erlang
15 | -export([get_module_refs/4]).
16 |
17 | %%
18 | %% Include files
19 | %%
20 |
21 | %% -define(DEBUG, 1).
22 |
23 | -define(CACHE_VERSION, 31).
24 | -define(SERVER, erlide_noparse).
25 |
26 | -include_lib("erlide_common/include/erlide_dbglog.hrl").
27 | -include("erlide_noparse.hrl").
28 | -include("erlide_scanner_server.hrl").
29 | -include("erlide_search.hrl").
30 |
31 | %%
32 | %% API Functions
33 | %%
34 |
35 | -spec initial_parse(atom(), string(), string(), string(), boolean(), boolean()) ->
36 | {ok, #model{}, cached | renewing | dont_use_cache, [#ref{}]}
37 | | {error, term(), term()}.
38 |
39 | initial_parse(ScannerName, ModuleFileName, InitialText, StateDir, UseCache,
40 | UpdateSearchServer) ->
41 | try
42 | ?D({ScannerName, ModuleFileName, UseCache, UpdateSearchServer}),
43 | BaseName = filename:join(StateDir, atom_to_list(ScannerName)),
44 | RefsFileName = BaseName ++ ".refs",
45 | RenewFun = fun(_F) ->
46 | Tokens = get_tokens(ScannerName, ModuleFileName,
47 | InitialText, StateDir),
48 | {Model, Refs} =
49 | do_parse(ScannerName, RefsFileName, Tokens, StateDir,
50 | UpdateSearchServer),
51 | {Model, Refs}
52 | end,
53 | CacheFileName = BaseName ++ ".noparse",
54 | {Cached, {Model, Refs}} = erlide_cache:check_and_renew_cached(
55 | ModuleFileName, CacheFileName, ?CACHE_VERSION,
56 | RenewFun, UseCache),
57 | {ok, Model, Cached, Refs}
58 | catch
59 | error:Reason:Stacktrace ->
60 | {error, Reason, Stacktrace}
61 | end.
62 |
63 | -spec reparse(atom(), boolean()) ->
64 | {ok, #model{}, cached | renewing | dont_use_cache, [#ref{}]}
65 | | {error, term(), term()}.
66 | reparse(ScannerName, UpdateSearchServer) ->
67 | try
68 | Tokens = erlide_scanner:get_tokens(ScannerName),
69 | {Model, _Refs} = do_parse(ScannerName, "", Tokens, "", UpdateSearchServer),
70 | {ok, Model}
71 | catch
72 | error:Reason:Stacktrace ->
73 | {error, Reason, Stacktrace}
74 | end.
75 |
76 | -spec get_module_refs(atom(), string(), string(), boolean()) -> [#ref{}].
77 | get_module_refs(ScannerName, ModulePath, StateDir, UpdateSearchServer) ->
78 | BaseName = filename:join(StateDir, atom_to_list(ScannerName)),
79 | RefsFileName = BaseName ++ ".refs",
80 | %% TODO: shouldn't we check that .refs is up-to-date? using renew
81 | %% function etc. would probably be more straight-forward...
82 | ?D(RefsFileName),
83 | case file:read_file(RefsFileName) of
84 | {ok, Binary} ->
85 | binary_to_term(Binary);
86 | _ ->
87 | InitialText = case file:read_file(ModulePath) of
88 | {ok, InitialTextBin} ->
89 | binary_to_list(InitialTextBin);
90 | _ ->
91 | ""
92 | end,
93 | {ok, _, _, Refs} = initial_parse(ScannerName, ModulePath, InitialText,
94 | StateDir, true, UpdateSearchServer),
95 | Refs
96 | end.
97 |
98 | -spec remove_cache_files(atom(), string) -> ok | {error, term()}.
99 | %% remove all cache files for an erlang module in erlide
100 | remove_cache_files(ScannerName, StateDir) ->
101 | BaseName = filename:join(StateDir, atom_to_list(ScannerName)),
102 | ScannerCacheFileName = BaseName ++ ".scan",
103 | file:delete(ScannerCacheFileName),
104 | RefsFileName = BaseName ++ ".refs",
105 | file:delete(RefsFileName),
106 | CacheFileName = BaseName ++ ".noparse",
107 | file:delete(CacheFileName).
108 |
109 | %%
110 | %% Internal functions
111 | %%
112 |
113 | get_tokens(ScannerName, ModuleFileName, InitialText, StateDir) ->
114 | case whereis(ScannerName) of
115 | undefined ->
116 | {_Cached, Module} = erlide_scanner:initial_scan_0(ScannerName, ModuleFileName, InitialText, StateDir, true),
117 | erlide_scan_model:get_all_tokens(Module);
118 | _ ->
119 | erlide_scanner:get_tokens(ScannerName)
120 | end.
121 |
122 | do_parse(ScannerName, RefsFileName, Tokens, StateDir, UpdateSearchServer) ->
123 | {Forms, Comments, References} = erlide_np:parse(Tokens),
124 | ?D(Forms),
125 | Model = #model{forms=Forms, comments=Comments},
126 | CompactModel = erlide_np_util:compact_model(Model),
127 | ?D(CompactModel),
128 | case StateDir of
129 | "" -> ok;
130 | _ ->
131 | file:write_file(RefsFileName, term_to_binary(References, [compressed]))
132 | end,
133 | update_search_server(UpdateSearchServer, ScannerName, References),
134 | {CompactModel, References}.
135 |
136 | update_search_server(true, ScannerName, Refs) ->
137 | erlide_search_server:add_module_refs(ScannerName, Refs);
138 | update_search_server(_, _, _) ->
139 | ok.
140 |
141 |
--------------------------------------------------------------------------------
/ide/apps/erlide_ide_core/src/erlide_np_records.erl:
--------------------------------------------------------------------------------
1 | %% Author: jakob
2 | %% Created: 18 dec 2010
3 | -module(erlide_np_records).
4 |
5 | %%
6 | %% Include files
7 | %%
8 |
9 | -include("erlide_token.hrl").
10 | -include("erlide_search.hrl").
11 |
12 | %%
13 | %% Exported Functions
14 | %%
15 | -export([check_fields/2]).
16 |
17 | %%
18 | %% API Functions
19 | %%
20 |
21 |
22 | % check refs to record fields
23 | %
24 |
25 | check_fields(Tokens, RecordName) ->
26 | check_fields(record_name, Tokens, RecordName, [], '', []).
27 |
28 | %%
29 | %% Local Functions
30 | %%
31 |
32 | check_fields(_State, [], _RecordName, Fields, _PrevRecordName, RightSides) ->
33 | {[], Fields, lists:reverse(RightSides)};
34 | check_fields(_State, [#token{kind='}'} | Rest], _RecordName, Fields, _PrevRecordName, RightSides) ->
35 | {Rest, Fields, lists:reverse(RightSides)};
36 | %% check_fields(_State, [#token{kind=','} | Rest], _RecordName, Fields, '', RightSides) ->
37 | %% {Rest, Fields, lists:reverse(RightSides)};
38 | check_fields(_State, [#token{kind='#'} | Rest], RecordName, Fields, PrevRecordName, RightSides) -> % 1
39 | check_fields(record_want_name, Rest, RecordName, Fields, PrevRecordName, RightSides);
40 | check_fields(record_want_name, [#token{kind=atom, value=NewRecordName} | Rest], RecordName, Fields, _PrevRecordName, RightSides) -> % 2
41 | check_fields(record_name, Rest, NewRecordName, Fields, RecordName, RightSides);
42 | check_fields(record_want_name, [#token{kind=macro, value=NewRecordName} | Rest], RecordName, Fields, _PrevRecordName, RightSides) -> % 2
43 | check_fields(record_name, Rest, NewRecordName, Fields, RecordName, RightSides);
44 | check_fields(record_want_name, [#token{kind='?'} | Rest], RecordName, Fields, _PrevRecordName, RightSides) -> % 2
45 | check_fields(record_name, Rest, '?', Fields, RecordName, RightSides);
46 | check_fields(record_name, [#token{kind=Dot} | Rest], RecordName, Fields, PrevRecordName, RightSides) % 3
47 | when Dot=:='.'; Dot=:=dot->
48 | check_fields(record_want_dot_field, Rest, RecordName, Fields, PrevRecordName, RightSides);
49 | check_fields(record_want_dot_field, [#token{kind=atom, value=FieldName, offset=Offset, length=Length} | Rest],
50 | RecordName, Fields, _PrevRecordName, RightSides) -> % 4
51 | NewFields = [{Offset, Length, #record_field_ref{name=FieldName, record=RecordName}} | Fields],
52 | {Rest, NewFields, lists:reverse(RightSides)};
53 | check_fields(record_name, [#token{kind='{'} | Rest], RecordName, Fields, PrevRecordName, RightSides) -> % 5
54 | check_fields(record_want_field, Rest, RecordName, Fields, PrevRecordName, RightSides);
55 | check_fields(State, [#token{kind='{'} | Rest], RecordName, Fields, PrevRecordName, RightSides) -> % 6
56 | {NewRest, NewFields, NewRS} = check_fields(no_record, Rest, RecordName, Fields, PrevRecordName, RightSides),
57 | check_fields(State, NewRest, RecordName, NewFields, PrevRecordName, lists:reverse(NewRS));
58 | check_fields(record_want_field, [#token{kind=atom, value=FieldName, offset=Offset, length=Length} | Rest],
59 | RecordName, Fields, PrevRecordName, RightSides) -> % 7
60 | NewFields = [{Offset, Length, #record_field_ref{name=FieldName, record=RecordName}} | Fields],
61 | check_fields(record_field, Rest, RecordName, NewFields, PrevRecordName, RightSides);
62 | check_fields(no_record, [#token{kind=','} | Rest], RecordName, Fields, PrevRecordName, RightSides) -> % 8
63 | check_fields(record_want_field, Rest, RecordName, Fields, PrevRecordName, RightSides);
64 | check_fields(record_field, [#token{kind='='} | Rest], RecordName, Fields, PrevRecordName, RightSides) -> % 9
65 | check_fields(no_record, Rest, RecordName, Fields, PrevRecordName, RightSides);
66 | check_fields(_State, [T | Rest], RecordName, Fields, PrevRecordName, RightSides) -> % 10
67 | check_fields(no_record, Rest, RecordName, Fields, PrevRecordName, [T | RightSides]).
68 |
--------------------------------------------------------------------------------
/ide/apps/erlide_ide_core/src/erlide_np_util.erl:
--------------------------------------------------------------------------------
1 | %% Author: jakob
2 | %% Created: 7 nov 2010
3 | -module(erlide_np_util).
4 |
5 | %% -define(DEBUG, 1).
6 |
7 | -include_lib("erlide_common/include/erlide_dbglog.hrl").
8 | -include("erlide_noparse.hrl").
9 | -include("erlide_token.hrl").
10 |
11 | -export([extract_comments/1, split_after_dots/1, skip_to/2,
12 | get_between_outer_pars/3, compact_model/1, get_top_level_comments/2]).
13 |
14 | %% @doc extract comments from tokens, and concatenate multiline comments to one token
15 | -spec extract_comments([token()]) -> {[token()],[token()]}.
16 | %%
17 | extract_comments(Tokens) ->
18 | extract_comments(Tokens, -1, [], []).
19 |
20 | extract_comments([], _, TAcc, CAcc) ->
21 | {lists:reverse(TAcc), lists:reverse(CAcc)};
22 | extract_comments([#token{kind=comment, offset=ONext, length=LNext, line=NNext,
23 | text=VNext}
24 | | Rest], NNext, TAcc,
25 | [#token{kind=comment, offset=O, text=V}=C | CAcc]) ->
26 | NewComment = C#token{offset=O, length=ONext-O+LNext, text = <>,
27 | last_line=NNext-1},
28 | extract_comments(Rest, NNext+1, TAcc, [NewComment | CAcc]);
29 | extract_comments([C = #token{kind=comment, line=N} | Rest], _, TAcc, CAcc) ->
30 | extract_comments(Rest, N+1, TAcc, [C | CAcc]);
31 | extract_comments([T | Rest], _, TAcc, CAcc) ->
32 | extract_comments(Rest, -1, [T | TAcc], CAcc).
33 |
34 | %% @doc split tokens list at 'dot' tokens
35 | -spec split_after_dots([token()]) -> [[token()]].
36 | %%
37 | split_after_dots(D) ->
38 | split_after_dots(D, [], []).
39 |
40 | split_after_dots([], Acc, []) ->
41 | erlide_util:reverse2(Acc);
42 | split_after_dots([], Acc, FunAcc) ->
43 | split_after_dots([], [FunAcc | Acc], []);
44 | split_after_dots([#token{kind = eof} | _], Acc, FunAcc) ->
45 | split_after_dots([], Acc, FunAcc);
46 | split_after_dots([T = #token{kind = dot} | TRest], Acc, FunAcc) ->
47 | split_after_dots(TRest, [[T | FunAcc] | Acc], []);
48 | split_after_dots([T | TRest], Acc, FunAcc) ->
49 | split_after_dots(TRest, Acc, [T | FunAcc]).
50 |
51 | %% @doc drop tokens until delimiter
52 | -spec skip_to([token()], atom()) -> [token()].
53 | %%
54 | skip_to([], _Delim) ->
55 | [];
56 | skip_to([#token{kind=Delim} | _] = L, Delim) ->
57 | L;
58 | skip_to([_ | Rest], Delim) ->
59 | skip_to(Rest, Delim).
60 |
61 | %%
62 | -spec get_between_outer_pars([token()], atom(), atom()) -> [token()].
63 | %%
64 | get_between_outer_pars(T, L, R) ->
65 | case skip_to(T, L) of
66 | [] ->
67 | [];
68 | [_ | S] ->
69 | {RL, _Rest} = gbop(S, L, R),
70 | lists:reverse(tl(lists:reverse(RL)))
71 | end.
72 |
73 | gbop([], _L, _R) ->
74 | {[], []};
75 | gbop([eof | _], _L, _R) ->
76 | {[], []};
77 | gbop([#token{kind=R}=T | Rest], _L, R) ->
78 | {[T], Rest};
79 | gbop([#token{kind=L}=T | Rest], L, R) ->
80 | {R1, Rest1} = gbop(Rest, L, R),
81 | {R2, Rest2} = gbop(Rest1, L, R),
82 | {[T] ++ R1 ++ R2, Rest2};
83 | gbop([T | Rest], L, R) ->
84 | {LR, Rest1} = gbop(Rest, L, R),
85 | {[T] ++ LR, Rest1}.
86 |
87 | %% change model to more compact to miminize terms from erlang to java
88 | -spec compact_model(model()) -> model().
89 | %%
90 | compact_model(#model{forms=Forms, comments=Comments}) ->
91 | FixedComments = compact_tokens(Comments),
92 | FixedForms = compact_forms(Forms),
93 | #model{forms=FixedForms, comments=FixedComments}.
94 |
95 | compact_forms(Forms) ->
96 | [compact_form(Form) || Form <- Forms].
97 |
98 | compact_tokens(Tokens) ->
99 | [compact_token(Token) || Token <- Tokens].
100 |
101 | compact_token(#token{value=Value} = Token) when is_list(Value) ->
102 | Token#token{value=to_binary_with_unicode(Value)};
103 | compact_token(#token{text=Text} = Token) when is_list(Text) ->
104 | Token#token{value=to_binary_with_unicode(Text)};
105 | compact_token(Token) ->
106 | Token.
107 |
108 | list_of_binaries(Args) when is_list(Args) ->
109 | [unicode:characters_to_binary(A) || A <- Args];
110 | list_of_binaries(_) ->
111 | [].
112 |
113 | compact_form(#function{clauses=Clauses, args=Args} = Function) ->
114 | Function#function{clauses=compact_forms(Clauses), args=list_of_binaries(Args)};
115 | compact_form(#clause{head=Head, args=Args} = Clause) ->
116 | Clause#clause{head=to_binary_with_unicode(Head), args=list_of_binaries(Args)};
117 | compact_form(Other) ->
118 | Other.
119 |
120 | to_binary_with_unicode(Comment) when is_list(Comment) ->
121 | unicode:characters_to_binary(Comment);
122 | to_binary_with_unicode(Other) ->
123 | Other.
124 |
125 | %% @doc retrieve top level comments
126 | -spec get_top_level_comments([tuple()], [token()]) -> [token()].
127 | %%
128 | get_top_level_comments(Forms, Comments) ->
129 | get_top_level_comments(Forms, Comments, []).
130 |
131 | get_top_level_comments(_Forms, [], Acc) ->
132 | lists:reverse(Acc);
133 | get_top_level_comments([], Comments, Acc) ->
134 | lists:reverse(Acc, Comments);
135 | get_top_level_comments([Form | FormRest] = Forms,
136 | [#token{offset=CommentOffset, length=CommentLength}=Comment | CommentRest] = Comments,
137 | Acc) ->
138 | {{_Line, _LastLine, FormOffset}, FormLength} = get_form_pos(Form),
139 | case relative_pos(CommentOffset, CommentLength, FormOffset, FormLength) of
140 | within ->
141 | get_top_level_comments(FormRest, CommentRest, Acc);
142 | before ->
143 | get_top_level_comments(Forms, CommentRest, [Comment | Acc]);
144 | 'after' ->
145 | get_top_level_comments(FormRest, Comments, Acc);
146 | overlapping ->
147 | get_top_level_comments(FormRest, CommentRest, Acc)
148 | end.
149 |
150 | get_form_pos(#function{pos=Pos}) -> Pos;
151 | get_form_pos(#attribute{pos=Pos}) -> Pos;
152 | get_form_pos(#clause{pos=Pos}) -> Pos;
153 | get_form_pos(#other{pos=Pos}) -> Pos.
154 |
155 | relative_pos(Offset1, Length1, Offset2, Length2)
156 | when Offset1 >= Offset2, Offset1 + Length1 =< Offset2 + Length2 ->
157 | within;
158 | relative_pos(Offset1, Length1, Offset2, _Length2)
159 | when Offset1+Length1 =< Offset2 ->
160 | before;
161 | relative_pos(Offset1, _Length1, Offset2, Length2)
162 | when Offset1 >= Offset2+Length2 ->
163 | 'after';
164 | relative_pos(_, _, _, _) ->
165 | overlapping.
166 |
--------------------------------------------------------------------------------
/ide/apps/erlide_ide_core/src/erlide_parse.erl:
--------------------------------------------------------------------------------
1 | -module(erlide_parse).
2 |
3 | %% API
4 | -export([consult/1]).
5 |
6 | %% for tests
7 | -export([split/1]).
8 |
9 | consult(B) when is_binary(B) ->
10 | consult(binary_to_list(B));
11 | consult(L) when is_list(L) ->
12 | {ok, Toks, _} = erl_scan_local:string(L),
13 | FormToks = split(Toks),
14 | lists:map(fun parse1/1, FormToks).
15 |
16 | parse1(Toks) ->
17 | R = erl_parse:parse_exprs(Toks),
18 | case R of
19 | {ok, [Fs]} ->
20 | erl_parse:normalise(Fs);
21 | Err ->
22 | throw(Err)
23 | end.
24 |
25 | split(L) ->
26 | split(L , [], []).
27 |
28 | split([], R, []) ->
29 | lists:reverse(R);
30 | split([], R, Acc) ->
31 | lists:reverse(R, [lists:reverse(Acc)]);
32 | split([{dot, _}=H|T], R, Acc) ->
33 | split(T, [lists:reverse(Acc, [H])|R], []);
34 | split([H|T], R, Acc) ->
35 | split(T, R, [H|Acc]).
36 |
37 |
--------------------------------------------------------------------------------
/ide/apps/erlide_ide_core/src/erlide_scan.erl:
--------------------------------------------------------------------------------
1 | -module(erlide_scan).
2 |
3 | -export([string/1,
4 | string/2,
5 | string/3,
6 | reserved_word/1,
7 | filter_ws/1,
8 | filter_comments/1,
9 | filter_ws_comments/1]).
10 |
11 | -include("erlide_token.hrl").
12 |
13 | string(String) ->
14 | string(String, {0, 1}).
15 |
16 | string(String, Pos) when is_tuple(Pos) ->
17 | string(String, Pos, []);
18 | string(String, Opts) when is_list(Opts) ->
19 | string(String, {0, 1}, Opts).
20 |
21 | string(String, {L, C}, Opts) ->
22 | string(String, {L, C, 0}, Opts);
23 | string(String, {L, C, O}, Opts) ->
24 | case string2(String, {L, C, O}, Opts) of
25 | {ok, _, _}=R ->
26 | R;
27 | {error, {_, _, {_, Quote, _}}, _} ->
28 | case string2(String++[Quote], {L, C, O}, Opts) of
29 | {ok, _, _}=R1 ->
30 | R1;
31 | _Err ->
32 | _Err
33 | end;
34 | _Err2 ->
35 | _Err2
36 | end.
37 |
38 | string2(String, {L, C, O}, Opts) ->
39 | case erl_scan_local:string(String, {L, C}, [text, return |Opts]) of
40 | {ok, Tokens, {L1, C1}} ->
41 | {ok, NewTokens, O1} = convert_tokens(Tokens, O),
42 | {ok, filter_tokens(NewTokens, Opts), {L1, C1, O1}};
43 | _Err ->
44 | _Err
45 | end.
46 |
47 | reserved_word(Word) ->
48 | erl_scan_local:reserved_word(Word).
49 |
50 | filter_ws(L) ->
51 | lists:filter(fun(#token{kind=Kind}) -> Kind =/= white_space end, L).
52 |
53 | filter_comments(L) ->
54 | lists:filter(fun(#token{kind=Kind}) -> Kind =/= comment end, L).
55 |
56 | filter_ws_comments(L) ->
57 | lists:filter(fun(#token{kind=Kind}) -> (Kind =/= comment) and (Kind =/= white_space) end, L).
58 |
59 | filter_tokens(Tokens, Opts) ->
60 | case {lists:member(return, Opts),
61 | lists:member(return_comments, Opts),
62 | lists:member(return_white_space, Opts)} of
63 | {true, _, _} ->
64 | Tokens;
65 | {_, true, true} ->
66 | Tokens;
67 | {_, true, false} ->
68 | filter_ws(Tokens);
69 | {_, false, true} ->
70 | filter_comments(Tokens);
71 | {_, false, false} ->
72 | filter_ws_comments(Tokens)
73 | end.
74 |
75 | convert_tokens(Tokens, O) ->
76 | convert_tokens(Tokens, O, []).
77 |
78 | convert_tokens([], Ofs, Acc) ->
79 | {ok, lists:reverse(Acc), Ofs};
80 | convert_tokens([{'?', [{line, L}, {column, O1}, {text, "?"}]}, {'?', [{line, L}, {column, O2}, {text, "?"}]}, {atom, [{line, L}, {column, O}, {text, Txt}], _V} | Rest],
81 | Ofs, Acc) when O2=:=O1+1; O=:=O2+1 ->
82 | Txt1 = [$?, $? | Txt],
83 | T = make_macro(L, Ofs, length(Txt1), Txt1),
84 | convert_tokens(Rest, Ofs+length(Txt1), [T | Acc]);
85 | convert_tokens([{'?', [{line, L}, {column, O1}|_]}, {'?', [{line, L}, {column, O2}|_]}, {var, [{line, L}, {column, O}, {text, Txt}], _V} | Rest],
86 | Ofs, Acc) when O2=:=O1+1; O=:=O2+1 ->
87 | Txt1 = [$?, $? | Txt],
88 | T = make_macro(L, Ofs, length(Txt1), Txt1),
89 | convert_tokens(Rest, Ofs+length(Txt1), [T | Acc]);
90 | convert_tokens([{'?', [{line, L}, {column, O}|_]}, {atom, [{line, L}, {column, O1}, {text, Txt}], _V} | Rest],
91 | Ofs, Acc) when O1=:=O+1->
92 | Txt1 = [$? | Txt],
93 | T = make_macro(L, Ofs, length(Txt1), Txt1),
94 | convert_tokens(Rest, Ofs+length(Txt1), [T | Acc]);
95 | convert_tokens([{'?', [{line, L}, {column, O}|_]}, {var, [{line, L}, {column, O1}, {text, Txt}], _V} | Rest],
96 | Ofs, Acc) when O1=:=O+1->
97 | Txt1 = [$? | Txt],
98 | T = make_macro(L, Ofs, length(Txt1), Txt1),
99 | convert_tokens(Rest, Ofs+length(Txt1), [T | Acc]);
100 | convert_tokens([{dot, [{line,L}, {column,_O}, {text,Txt}]} | Rest], Ofs, Acc) ->
101 | %% erl_scan conflates the dot with following whitespace.
102 | T = #token{kind=dot, line=L, offset=Ofs, length=1, text=[hd(Txt)]},
103 | case Txt of
104 | "." ->
105 | convert_tokens(Rest, Ofs+1, [T | Acc]);
106 | _ ->
107 | T1 = #token{kind=white_space, line=L, offset=Ofs+1, length=length(Txt)-1, text=list_to_binary(tl(Txt))},
108 | convert_tokens(Rest, Ofs+length(Txt), [T1, T | Acc])
109 | end;
110 | convert_tokens([{What, [{line,L}, {column,_O}, {text,Txt}], _} | Rest], Ofs, Acc) when What==white_space; What==comment ->
111 | T = #token{kind=What, line=L, offset=Ofs, length=length(Txt), text=unicode:characters_to_binary(Txt)},
112 | convert_tokens(Rest, Ofs+length(Txt), [T | Acc]);
113 | convert_tokens([{What, [{line,L}, {column,_O}, {text,Txt}], Sym} | Rest], Ofs, Acc) ->
114 | T = #token{kind=What, line=L, offset=Ofs, length=length(Txt), text=Txt, value=Sym},
115 | convert_tokens(Rest, Ofs+length(Txt), [T | Acc]);
116 | convert_tokens([{What, [{line,L}, {column,_O}, {text,Txt}]} | Rest], Ofs, Acc) ->
117 | T = #token{kind=What, line=L, offset=Ofs, length=length(Txt), text=Txt},
118 | convert_tokens(Rest, Ofs+length(Txt), [T | Acc]).
119 |
120 | make_macro(L, O, G, Txt) ->
121 | V = list_to_atom(Txt),
122 | #token{kind=macro, line=L, offset=O, length=G, text=Txt, value=V}.
123 |
124 |
--------------------------------------------------------------------------------
/ide/apps/erlide_ide_core/src/erlide_scan_util.erl:
--------------------------------------------------------------------------------
1 | %% @author jakob
2 | %% @doc @todo Add description to erlide_scan_util.
3 |
4 |
5 | -module(erlide_scan_util).
6 |
7 | -export([split_lines_w_lengths/1, find_line_w_offset/2]).
8 |
9 | %% [{Length, TextIncNL}...]
10 | split_lines_w_lengths(Text) ->
11 | split_lines_w_lengths(Text, 0, [], []).
12 |
13 | split_lines_w_lengths("", _Length, [], Acc) ->
14 | lists:reverse(Acc);
15 | split_lines_w_lengths("", Length, LineAcc, Acc) ->
16 | lists:reverse(Acc, [{Length, lists:reverse(LineAcc)}]);
17 | split_lines_w_lengths("\r\n" ++ Text, Length, LineAcc, Acc) ->
18 | split_lines_w_lengths(Text, 0, [],
19 | [{Length+2, lists:reverse(LineAcc, "\r\n")} | Acc]);
20 | split_lines_w_lengths("\n" ++ Text, Length, LineAcc, Acc) ->
21 | split_lines_w_lengths(Text, 0, [],
22 | [{Length+1, lists:reverse(LineAcc, "\n")} | Acc]);
23 | split_lines_w_lengths("\r" ++ Text, Length, LineAcc, Acc) ->
24 | split_lines_w_lengths(Text, 0, [],
25 | [{Length+1, lists:reverse(LineAcc, "\r")} | Acc]);
26 | split_lines_w_lengths([C | Text], Length, LineAcc, Acc) ->
27 | split_lines_w_lengths(Text, Length+1, [C | LineAcc], Acc).
28 |
29 | %% Find a line from [{Length, Line
30 |
31 | find_line_w_offset(Offset, Lines) ->
32 | find_line_w_offset(Offset, 0, 0, Lines).
33 |
34 | find_line_w_offset(0, _Pos, _N, []) ->
35 | {0, 0, 0, "", on_eof};
36 | find_line_w_offset(_Offset, _Pos, _N, []) ->
37 | not_found;
38 | find_line_w_offset(Offset, Pos, N, [{Length, _Line} | Lines]) when Offset >= Pos+Length, Lines =/= [] ->
39 | find_line_w_offset(Offset, Pos+Length, N+1, Lines);
40 | find_line_w_offset(Offset, Pos, N, [{Length, Line} |_]) when Pos =< Offset, Offset < Pos + Length ->
41 | {N, Pos, Length, Line, false};
42 | find_line_w_offset(Offset, Pos, N, [{Length, Line}]) ->
43 | case ends_with_newline(Line) orelse Offset > Pos + Length of
44 | true ->
45 | {N+1, Pos+Length, 0, "", beyond_eof};
46 | false ->
47 | {N, Pos+Length, Length, Line, on_eof}
48 | end.
49 |
50 | ends_with_newline("") -> false;
51 | ends_with_newline("\n") -> true;
52 | ends_with_newline("\r") -> true;
53 | ends_with_newline("\r\n") -> true;
54 | ends_with_newline([_C | R]) ->
55 | ends_with_newline(R).
56 |
--------------------------------------------------------------------------------
/ide/apps/erlide_ide_core/src/erlide_scanner.erl:
--------------------------------------------------------------------------------
1 | %% Author: jakob
2 | %% Created: 24 apr 2008
3 | %% Description:
4 | -module(erlide_scanner).
5 |
6 | %%
7 | %% Include files
8 | %%
9 |
10 | %% -define(DEBUG, 1).
11 |
12 | -include_lib("erlide_common/include/erlide_dbglog.hrl").
13 | -include("erlide_token.hrl").
14 | -include("erlide_scanner_server.hrl").
15 |
16 | %%
17 | %% Exported Functions
18 | %%
19 |
20 | -export([light_scan_string/2, scan_string/1, initial_scan_0/5, initial_scan/5,
21 | get_token_at/2,
22 | create/1, addref/1, dispose/1, get_text/1,
23 | get_tokens/1, get_token_window/4,
24 | dump_module/1, replace_text/4]).
25 |
26 | %%
27 | %% API Functions
28 | %%
29 |
30 | -define(CACHE_VERSION, 25).
31 |
32 | light_scan_string(B, latin1) ->
33 | S = binary_to_list(B),
34 | do_light_scan(S);
35 | light_scan_string(B, utf8) ->
36 | S = unicode:characters_to_list(B),
37 | do_light_scan(S).
38 |
39 | scan_string(B) when is_binary(B) ->
40 | scan_string(binary_to_list(B));
41 | scan_string(L) when is_list(L) ->
42 | M = erlide_scan_model:do_scan('', L),
43 | erlide_scan_model:get_all_tokens(M).
44 |
45 | initial_scan_0(ScannerName, ModuleFileName, Text, StateDir, UseCache) ->
46 | CacheFileName = filename:join(StateDir, atom_to_list(ScannerName) ++ ".scan"),
47 | RenewFun = fun(_F) -> erlide_scan_model:do_scan(ScannerName, Text) end,
48 | erlide_cache:check_and_renew_cached(ModuleFileName, CacheFileName, ?CACHE_VERSION, RenewFun, UseCache).
49 |
50 | get_token_at(ScannerName, Offset) when is_atom(ScannerName), is_integer(Offset) ->
51 | erlide_scanner_server:server_cmd(ScannerName, get_token_at, Offset).
52 |
53 | initial_scan(ScannerName, ModuleFileName, InitialText, StateDir, UseCache)
54 | when is_atom(ScannerName), is_list(ModuleFileName), is_list(InitialText), is_list(StateDir) ->
55 | erlide_scanner_server:server_cmd(ScannerName, initial_scan,
56 | {ScannerName, ModuleFileName, InitialText, StateDir, UseCache}).
57 |
58 | create(ScannerName) when is_atom(ScannerName) ->
59 | erlide_scanner_server:spawn_server(ScannerName).
60 |
61 | addref(ScannerName) when is_atom(ScannerName) ->
62 | erlide_scanner_server:server_cmd(ScannerName, addref).
63 |
64 | dispose(ScannerName) when is_atom(ScannerName) ->
65 | erlide_search_server:remove_module(ScannerName),
66 | erlide_scanner_server:server_cmd(ScannerName, dispose).
67 |
68 | get_text(ScannerName) when is_atom(ScannerName) ->
69 | erlide_scanner_server:server_cmd(ScannerName, get_text).
70 |
71 | get_tokens(ScannerName) when is_atom(ScannerName) ->
72 | erlide_scanner_server:server_cmd(ScannerName, get_tokens).
73 |
74 | get_token_window(ScannerName, Offset, Before, After)
75 | when is_atom(ScannerName), is_integer(Offset), is_integer(Before), is_integer(After) ->
76 | erlide_scanner_server:server_cmd(ScannerName, get_token_window, {Offset, Before, After}).
77 |
78 | dump_module(ScannerName) when is_atom(ScannerName) ->
79 | erlide_scanner_server:server_cmd(ScannerName, dump_module).
80 |
81 | replace_text(ScannerName, Offset, RemoveLength, NewText)
82 | when is_atom(ScannerName), is_integer(Offset), is_integer(RemoveLength), is_list(NewText) ->
83 | erlide_scanner_server:server_cmd(ScannerName, replace_text, {Offset, RemoveLength, NewText}).
84 |
85 | %%
86 | %% Local Functions
87 | %%
88 |
89 | do_light_scan(S) ->
90 | case erlide_scan:string(S, {0, 1}, [return]) of
91 | {ok, T, _} ->
92 | {ok, convert_tokens(T)};
93 | {error, _, _} ->
94 | error
95 | end.
96 |
97 | -define(TOK_OTHER, 0).
98 | -define(TOK_WS, 1).
99 | -define(TOK_STR, 2).
100 | -define(TOK_ATOM, 3).
101 | -define(TOK_VAR, 4).
102 | -define(TOK_CHAR, 5).
103 | -define(TOK_MACRO, 6).
104 | -define(TOK_ARROW, 7).
105 | -define(TOK_INTEGER,8).
106 | -define(TOK_FLOAT, 9).
107 | -define(TOK_COMMENT, 10).
108 | -define(TOK_KEYWORD, 11).
109 |
110 | kind_small(ws) -> ?TOK_WS;
111 | kind_small(white_space) -> ?TOK_WS;
112 | kind_small(string) -> ?TOK_STR;
113 | kind_small(atom) -> ?TOK_ATOM;
114 | kind_small(var) -> ?TOK_VAR;
115 | kind_small(macro) -> ?TOK_MACRO;
116 | kind_small(dot) -> ?TOK_OTHER;
117 | kind_small(float) -> ?TOK_FLOAT;
118 | kind_small(integer) -> ?TOK_INTEGER;
119 | kind_small(char) -> ?TOK_CHAR;
120 | kind_small('->') -> ?TOK_ARROW;
121 | kind_small(comment) -> ?TOK_COMMENT;
122 | kind_small(Kind) when is_atom(Kind) ->
123 | case erlide_scan:reserved_word(Kind) of
124 | true ->
125 | ?TOK_KEYWORD;
126 | false ->
127 | case atom_to_list(Kind) of
128 | [I] when I > ?TOK_KEYWORD -> I;
129 | _ -> ?TOK_OTHER
130 | end
131 | end.
132 |
133 | convert_tokens(Tokens) ->
134 | Fun = fun(#token{kind=Kind, line=L, offset=O, text=Txt}) ->
135 | G = case is_list(Txt) of true -> length(Txt); _ -> byte_size(Txt) end,
136 | <<(kind_small(Kind)), L:24, O:24, G:24>>
137 | end,
138 | list_to_binary(lists:flatten([Fun(X) || X <- Tokens])).
139 |
140 |
--------------------------------------------------------------------------------
/ide/apps/erlide_ide_core/src/erlide_scanner_server.erl:
--------------------------------------------------------------------------------
1 | %% Author: jakob
2 | %% Created: 24 apr 2008
3 | %% Description:
4 | -module(erlide_scanner_server).
5 |
6 | %%
7 | %% Include files
8 | %%
9 |
10 | %% -define(DEBUG, 1).
11 |
12 | -include_lib("erlide_common/include/erlide_dbglog.hrl").
13 | -include("erlide_scanner_server.hrl").
14 |
15 | %%
16 | %% Exported Functions
17 | %%
18 |
19 | -export([server_cmd/2, server_cmd/3,
20 | spawn_server/1]).
21 |
22 | %% stop/0
23 |
24 | %% internal exports
25 | -export([loop/2]).
26 |
27 | %%
28 | %% API Functions
29 | %%
30 |
31 | server_cmd(ScannerName, Command) ->
32 | server_cmd(ScannerName, Command, []).
33 |
34 | server_cmd(ScannerName, Command, Args) ->
35 | try
36 | ScannerName ! {Command, self(), Args},
37 | receive
38 | {Command, _Pid, Result} ->
39 | Result
40 | end
41 | catch _:Exception:Stacktrace ->
42 | {error, Exception, Stacktrace}
43 | end.
44 |
45 | spawn_server(ScannerName) ->
46 | case whereis(ScannerName) of
47 | undefined ->
48 | Pid = spawn(fun() ->
49 | erlang:process_flag(save_calls, 50),
50 | erlang:process_flag(min_heap_size, 64*1024),
51 | loop(#module{name=ScannerName}, 0)
52 | end),
53 | erlang:register(ScannerName, Pid);
54 | _ ->
55 | ok
56 | end,
57 | server_cmd(ScannerName, addref, []),
58 | ok.
59 |
60 | %%
61 | %% Local Functions
62 | %%
63 |
64 | loop(Module, Refs) ->
65 | receive
66 | {addref, From, []} ->
67 | ?D({addref, Module#module.name}),
68 | reply(addref, From, ok),
69 | ?MODULE:loop(Module, Refs+1);
70 | {dispose, From, []} ->
71 | ?D({dispose, Module#module.name}),
72 | reply(dispose, From, ok),
73 | case Refs=<1 of
74 | true ->
75 | ok;
76 | _ ->
77 | ?MODULE:loop(Module, Refs-1)
78 | end;
79 | {Cmd, From, Args} ->
80 | NewModule = cmd(Cmd, From, Args, Module),
81 | ?MODULE:loop(NewModule, Refs);
82 | Msg ->
83 | erlide_log:log({scanner, Module#module.name, unexpected_message, Msg}),
84 | ?MODULE:loop(Module, Refs)
85 | end.
86 |
87 | cmd(Cmd, From, Args, Module) ->
88 | try
89 | case do_cmd(Cmd, Args, Module) of
90 | {R, NewModule} ->
91 | reply(Cmd, From, R),
92 | NewModule;
93 | NewModule ->
94 | reply(Cmd, From, ok),
95 | NewModule
96 | end
97 | catch
98 | exit:Error ->
99 | reply(Cmd, From, {exit, Error}),
100 | Module;
101 | error:Error:Stacktrace ->
102 | reply(Cmd, From, {error, Error, Stacktrace}),
103 | Module
104 | end.
105 |
106 | reply(Cmd, From, R) ->
107 | From ! {Cmd, self(), R}.
108 |
109 | do_cmd(initial_scan, {ScannerName, ModuleFileName, InitialText, StateDir, UseCache}, _Module) ->
110 | ?D({initial_scan, ScannerName, length(InitialText)}),
111 | {Cached, Module1} = erlide_scanner:initial_scan_0(ScannerName, ModuleFileName, InitialText, StateDir, UseCache),
112 | {{ok, Cached}, Module1};
113 | do_cmd(dump_module, [], Module) ->
114 | {Module, Module};
115 | do_cmd(get_token_at, Offset, Module) ->
116 | {erlide_scan_model:get_token_at(Module, Offset), Module};
117 | do_cmd(replace_text, {Offset, RemoveLength, NewText}, Module) ->
118 | ?D({replace_text, Offset, RemoveLength, length(NewText)}),
119 | erlide_scan_model:replace_text(Module, Offset, RemoveLength, NewText);
120 | do_cmd(get_text, [], Module) ->
121 | {erlide_scan_model:get_text(Module), Module};
122 | do_cmd(get_tokens, [], Module) ->
123 | {erlide_scan_model:get_all_tokens(Module), Module};
124 | do_cmd(get_token_window, {Offset, Before, After}, Module) ->
125 | {erlide_scan_model:get_token_window(Module, Offset, Before, After), Module}.
126 |
--------------------------------------------------------------------------------
/ide/apps/erlide_ide_core/test/erlide_parse_tests.erl:
--------------------------------------------------------------------------------
1 | -module(erlide_parse_tests).
2 |
3 | %%
4 | %% Include files
5 | %%
6 |
7 | -include_lib("eunit/include/eunit.hrl").
8 |
9 | split_test_() ->
10 | [
11 | ?_assertEqual([], erlide_parse:split([])),
12 | ?_assertEqual([[a,b,c]], erlide_parse:split([a,b,c])),
13 | ?_assertEqual([[a,{dot, 1}],[d,e]], erlide_parse:split([a,{dot, 1},d,e])),
14 | ?_assertEqual([[a,{dot, 1}],[d,e,{dot, 1}]], erlide_parse:split([a,{dot, 1},d,e,{dot, 1}]))
15 | ].
16 |
--------------------------------------------------------------------------------
/ide/apps/erlide_ide_core/test/erlide_scan_model_tests.erl:
--------------------------------------------------------------------------------
1 | %% @author jakob
2 |
3 | -module(erlide_scan_model_tests).
4 |
5 | %%
6 | %% Include files
7 | %%
8 |
9 | -include_lib("eunit/include/eunit.hrl").
10 | -include("erlide_token.hrl").
11 |
12 | %%
13 | %% Exported Functions
14 | %%
15 |
16 | %%
17 | %% API Functions
18 | %%
19 |
20 | scanner_test_() ->
21 | [?_assertEqual({[#token{kind = atom, line = 0, offset = 0,length = 1, value = a, text="a"},
22 | #token{kind = '(', line = 0, offset = 1, length = 1, text="("},
23 | #token{kind = ')', line = 0, offset = 2, length = 1, text=")"},
24 | #token{kind = '->', line = 0, offset = 4, length = 2, text="->"},
25 | #token{kind = atom, line = 0, offset = 7, length = 1, value = b, text="b"},
26 | #token{kind = dot, line = 0, offset = 8, length = 1, text = "."}],
27 | [#token{kind = atom, line = 0, offset = 0,length = 4, value = test, text="test"},
28 | #token{kind = '(', line = 0, offset = 4, length = 1, text="("},
29 | #token{kind = ')', line = 0, offset = 5, length = 1, text=")"},
30 | #token{kind = '->', line = 0, offset = 7, length = 2, text="->"},
31 | #token{kind = atom, line = 0, offset = 10, length = 1, value = b, text="b"},
32 | #token{kind = dot, line = 0, offset = 11, length = 1, text = "."}]},
33 | test_replace("a() -> b.", 0, 1, "test"))
34 | ].
35 |
36 | replace_at_eof_test_() ->
37 | [?_assertEqual({[#token{kind = atom, line = 0, offset = 0, length = 2, value = ab, text="ab"}],
38 | [#token{kind = atom, line = 0, offset = 0, length = 3, value = abc, text="abc"}]},
39 | test_replace("ab", 2, 0, "c"))
40 | ].
41 |
42 | replace_at_eol_test_() ->
43 | [?_assertEqual({[#token{kind = atom, line = 0, offset = 0, length = 1, value = a, text="a"},
44 | #token{kind = atom, line = 1, offset = 2, length = 1, value = b, text="b"}],
45 | [#token{kind = atom, line = 0, offset = 0, length = 2, value = ac, text="ac"},
46 | #token{kind = atom, line = 1, offset = 3, length = 1, value = b, text="b"}]},
47 | test_replace("a\nb", 1, 0, "c"))
48 | ].
49 |
50 | %%
51 | %% Local Functions
52 | %%
53 |
54 | test_replace(S, Pos, RemoveLength, NewText) ->
55 | M = erlide_scan_model:do_scan(testing, S),
56 | NewM = erlide_scan_model:replace_text(M, Pos, RemoveLength, NewText),
57 | R1 = erlide_scan_model:get_all_tokens(M),
58 | R2 = erlide_scan_model:get_all_tokens(NewM),
59 | {R1, R2}.
60 |
--------------------------------------------------------------------------------
/ide/build:
--------------------------------------------------------------------------------
1 | #! /bin/bash -e
2 |
3 | source ../build_utils.sh
4 |
5 | dir=`pwd`
6 | prj=`basename $dir`
7 |
8 | export LOCALDEP_DIR=`pwd`
9 | export REBAR_COLOR="low"
10 |
11 | build_project ../rebar3 $prj 25 "$@"
12 |
--------------------------------------------------------------------------------
/ide/rebar.config:
--------------------------------------------------------------------------------
1 | {require_otp_vsn, "25.*"}.
2 |
3 | {plugins, [
4 | {rebar_localdep, {git, "https://github.com/alinpopa/rebar3-localdep-plugin.git", {branch, "master"}}},
5 | covertool
6 | ]}.
7 |
8 | {deps, [
9 | {erlide_common, {localdep, "../common/apps/erlide_common"}},
10 | {jsx, ".*", {git, "https://github.com/talentdeficit/jsx.git", {branch, "v2.8.2"}}}
11 | ]}.
12 |
13 | {erl_opts, [
14 | warn_deprecated_function,
15 | warn_export_all,
16 | warn_export_vars,
17 | warn_obsolete_guard,
18 | warn_shadow_vars,
19 | warn_unused_function,
20 | warn_unused_import,
21 | warn_unused_record,
22 | warn_unused_vars,
23 |
24 | nowarnings_as_errors
25 | %warnings_as_errors
26 | ]}.
27 | {erl_first_files, [
28 | ]}.
29 |
30 | {edoc_opts,[{todo,true}]}.
31 |
32 | {eunit_opts, [
33 | verbose,
34 | %nowarn_missing_spec,
35 | nowarnings_as_errors,
36 | {report,{eunit_surefire,[{dir,"."}]}}
37 | ]}.
38 | {eunit_compile_opts, [
39 | nowarn_missing_spec
40 | ]}.
41 |
42 | {xref_warnings, true}.
43 | {xref_checks, [
44 | undefined_function_calls,
45 | undefined_functions,
46 | locals_not_used,
47 | % exports_not_used,
48 | deprecated_function_calls,
49 | deprecated_functions
50 | ]}.
51 |
52 | {dialyzer, [
53 | %% Store PLT locally inside the project in .rebar (Default)
54 | %% {plt_location, local},
55 | %% Store PLT in custom directory
56 | %% {plt_location, "custom_dir"},
57 | {warnings, [unmatched_returns, error_handling, unknown]},
58 | {base_plt_apps, [erts, kernel, stdlib, syntax_tools, tools]}
59 | ]}.
60 |
61 | {cover_export_enabled, true}.
62 | {cover_enabled, true}.
63 | {cover_print_enable, true}.
64 |
65 | {covertool_eunit, {"_build/test/cover/eunit.coverdata", "eunit.coverage.xml"}}.
66 | {covertool_prefix_len, 0}.
67 |
68 | {xref_checks,[
69 | undefined_function_calls,
70 | undefined_functions,
71 | locals_not_used,
72 | %exports_not_used,
73 | deprecated_function_calls,
74 | deprecated_functions
75 | ]}.
76 |
77 | {escript_main_app, erlide_ide}.
78 |
79 |
--------------------------------------------------------------------------------
/ide/rebar.lock:
--------------------------------------------------------------------------------
1 | [{<<"erlide_common">>,{localdep,"../common/apps/erlide_common"},0},
2 | {<<"jsx">>,
3 | {git,"https://github.com/talentdeficit/jsx.git",
4 | {ref,"d4b6d3dc5fd9e759ff7a0c476654ea5124f5bae9"}},
5 | 0}].
6 |
--------------------------------------------------------------------------------
/rebar.lock:
--------------------------------------------------------------------------------
1 | [].
2 |
--------------------------------------------------------------------------------
/rebar3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erlang/erlide_kernel/ba61079066c495ad22f4da52da294cf0f97d489f/rebar3
--------------------------------------------------------------------------------