├── .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 --------------------------------------------------------------------------------