summaryrefslogtreecommitdiff
path: root/java
diff options
context:
space:
mode:
authorTor Norbye <tnorbye@google.com>2013-11-12 10:41:52 -0800
committerTor Norbye <tnorbye@google.com>2013-11-12 10:42:01 -0800
commit9c6f3112ffe942e4bb0b5d5d8476ce7014499650 (patch)
treea0a1a2817c17cddc428e1faf8dd7754ab593c0dc /java
parentf88d3e15cd8228cba4070811da68d8ad54d81fd7 (diff)
downloadidea-9c6f3112ffe942e4bb0b5d5d8476ce7014499650.tar.gz
Snapshot 205707dc11cdd6508ae84db85d104f834028fd65 from idea/132.1045 of git://git.jetbrains.org/idea/community.git
205707d: support abbreviations in Search Everywhere 9eeb98a: NPE fix f701598: AA painting for shortcuts 9636e23: add abbreviations d1f7c58: IDEA-116296 Search match looks terrible under Retina 8bc5adc: AIOOBE f92fa41: IDEA-116194 "Generate equals() and hashcode()" for final classes should disable "accept subclasses" variant ec773fc: CCE 9a208ab: selected completion item should be the first or second visible (IDEA-115199) be542d6: linear-time filterByDumbAwareness 83273e5: faster next/prev occurrence action in the console (IDEA-115163) d684469: LanguageConsole: shutdown printXXX fiesta. Everyone is advised to use ConsoleView API the right way. 480215a: Merge branch 'master' of git.labs.intellij.net:idea/community c85aae4: https://android-review.googlesource.com/69716 76daf2e: Heroku integration - show log on redeploy c567431: Jediterm updated (PY-11368). 5d325de: Accept only terminal tabs on DnD. a1d5cd4: Merge remote-tracking branch 'origin/master' 0a3bcdb: Jediterm updated. 218607a8: Terminal: support presentation mode. ea6fd6f: switch on console-content-type highlighting in all language consoles e824117: Quick fix for RefParserTest 450ecea: suggest scrambled classes on second completion 7ba82d9: NPE fixed 525a30d: cleanup 2fa314d: don't display "Loading spellchecker dictionaries" in status bar (IDEA-115130) 276a47a: don't suggest scrambled classes in autopopup (IDEA-115199) b4a4b99: temporary fix for layouts of small IDEs 02e07e1: [log] Move SimpleHash from vcs-log-graph to vcs-log-impl f7b1796: [log] Hash -> int in Graph 0c4d0bb: [log] Don't call new VcsRefImpl() directly, use the factory 4c1c1c2: [log] Memory consumption: Hash -> int. Take 1 2e36939: Improvement from Roman Shevchenko to be compatible with Ubuntu 13.10. b6edb35: Show pin icon in pinned Find Usages tabs c143cee: IDEA-110064 JSF 2.2: Pass-through elements: if upper-case symbols are used instead of default 'jsf' namespace prefix, attributes are red-highlihted 3a69458: added actions 'mark/unmark as generated sources root' to popup menu bdfc48c: Use maven3 importer by default. d9417b6: Merge remote-tracking branch 'origin/master' 5b526fc: Add pty libs to pycharm community build. c912c67: add HowTo 6d940b1: depend on PsiModificationTracker.JAVA_STRUCTURE_MODIFICATION_COUNT if the file cannot be resolved yet 7c63c25: platform: jayatana patched to support Ubuntu 13.10 (sources only) 59622ee: IDEA-116276 Console font is small in Presentation mode 6863abc: IDEA-115889 Framework toolwindows: support scope-based file colors for items ac0f8ab: obtaining framework libraries from app server: download libraries list asynchronously from server 185804e: refactor supported root type checking according to CR-IC-3056 6b085fe: formatter removes spaces in import statement parentheses (PY-11359) b04030e: Show pin icon in pinned Find Usages tabs 90ea6d7: do not disable empty frameworks page if no templates available bb55e29: platform: jayatana sources attached d1911f7: platform: Ubuntu app menu loading code extracted and corrected 897738a: Cleanup (deprecated code) 56e41fb: Check Grails SDK in background thread, not in the AWT. +review CR-IU @gromopert fd2b6b3: IDEA-115074 New Project Wizard: Grails: grails-specific settings are missing a69a88a: spi: decline abstract classes, suggest all available inheritors (IDEA-115502) eeaee1e: SIOOBE 6cd3cb9: Fix spelling 5f4c814: IDEA-102413 (pointless assertion dropped) dc455bd: Cleanup (arrangement, formatting) 44590dc: IDEA-25934 Maven: Webapp resources filtering store web resources configuration. 6e65f2b: IDEA-25934 Maven: Webapp resources filtering store web resources configuration. df137ae: DOM stubs: namespace key index 046e455: Merge remote-tracking branch 'origin/master' 0681517: testdata fixed dd63221: IDEA-116168 Action creation does not escape special chars in plugin.xml 48fa01e: restore plugin description d34d829: new project wizard: remote templates 389db71: methods renamed b07e674: prefer non-qualified xml completion variants (IDEA-115355) add165a: IDEA-116144 Opening build.gradle of android project fails d524a84: refixed IDEA-111753 to remove unnecessary dependency on debugger b8df146: show usages from generated code in separate group (IDEA-97579) 034f42b: removed obsolete 'remote-server-util' module from installation, added new module to git plugin installation c8deccf: download libraries in parallel (IDEA-88561) 674de91: our LinkedHashMap: added methods to obtain last added key/value 43aced8: Restore context menu after DnD back to Terminal View. b6987d3: Merge remote-tracking branch 'origin/master' c147027: Fix: terminal tab doesn't save name change after DnD. 495bda4: JediTerm update to version 1.0 46667e2: Fix closing tab on session end. Fix popup for editor terminal tabs. fdd3e70: Fix potential NPE. 9ea940a: [git] Fix refresh notification after changing non-active branch hashes 34b357c: more console folding by default d21cf01: Fix memory leak. 1dcfd64: Fix removing terminal tabs on drag'n'drop. 29a4f60: add accessOrder parameter to our LinkedHashMap e0ff96d: DockableEditorTabbedContainer shouldn't return root pane as accept area as it makes impossible to add any other dockable container. It is better to return root pane in the special fallback method after we checked all containers. 4b22045: Terminal tabs: drag'n'drop to editor and back implemented. 6ac9ae9: DockableEditor doesn't need EditorWindow reference. 73f7ab5: [log] IDEA-115980 Don't show Git actions if there are no Git roots 7964385: [log] "Go To Commit" action c647083: [log] Extract the popup text field used for user completion 7e9497a: Merge remote-tracking branch 'origin/master' 0eb8a6f: [log] Fix hidden graph because of the date filter existance 95d5d5b: [log] IDEA-116022 Implement Structure filter for VCS Log & Git 4989fa1: [vcs] VcsStructureChooser: remove dependency on the AbstractVcs. 278cd62: [log] move structure filter implementation to vcs-log-impl 9b5b1c2: Github: change search request parameter a543347: IDEA-115330 Incorrect "condition is always false" 0b85cc1: trying to make project opening progress information more meaningful (IDEA-115130) 35af155: Don't display empty panel if there are no moreMessage in the dialog 41592ca: [vcs] IDEA-116036 Pressing Escape in Commit/TODO dialog performs commit 7c5ba53: [log] Fix IDEA-115676 once again 8fb8d34: [log] IDEA-116056 Display commit time in details if different from author time 9b6d291: [log] IDEA-116022 Add filter by date c49b45b: only suppress eager psi creation when there were stubs in the file f815aa9: our LinkedHashMap clients aren't necessarily aware that it updates its ordering on every get. Let clients specify if they need this feature (IDEA-116222) 6fcd19c: return not-null MODULE_CONTEXT data only for single content roots (IDEA-115422) 0af49e6: fix two psi elements per one ast element in stub-ast switch: psi1 is taken from stub psi2 is eagerly created during chameleon parsing another thread gets the ast when some psi1 parent is already switched and psi1 is not, it walks down the ast and gets psi2 fcfef16: remove big JI sign 2ad7bd2: support for <shortcut> cd74ff8: IDEA-116206 59b556f: set transparency 20% 152e772: fix missing help button b8f59ef: add getLanguage() method 25dece1: IDEA-110540 ("String concat (+) and super.toString()" template adds "+ super.toString()" even if no super) 35c07da: new inference: reject isExact for no constructor parameterized class 5fafbd5: EA-51725 - NPE: IntroduceVariableBase.replace 22cf8de: ignore anonymous classes when generating constructors EA-51713 - assert: CreateConstructorMatchingSuperFix$.run 1735391: getWidget method fcb4970: attempt to fix IDEA-116128 LiveEdit doesn't work correctly for JSP files 36e4932: continue "ability to return list of URLs" — isConfigurationFromContext d67f88c: Cleanup (formatting) 3112d12: reliably check if a task for debugger manager thread was interrupted 201c7b5: IDEA-75717 ("Referenced checked for null not used inside if" false positive) 795357c: do not suppress file-level inspections 4745efc: continue "ability to return list of URLs" IDEA-115787 43216f8: IDEA-115787 Better resolvement for JSF page URLs 2e6db86: IDEA-100279 ChooseComponentsToExportDialog 72ee12c: fix warning "mac file equals" 19576b2: overrides, cleanup 0a15306: IDEA-100279 git init b596340: IDEA-100279 xml editor location dialog 3c0f6cd: IDEA-100279 copyright plugin b7c6e4c: overrides e9e6eb2: 'Download library' refactored a little 946216e: IDEA-116197 (filter improvements) 9439744: EA-51425 - ISE: MavenUtil.resolveSuperPomFile add assertion. 9c38499: EA-51325 - assert: MavenIndices.createNewDir 9346755: don't log Connection reset by peer cfb11fa: cleanup 038e39d: IDEA-114461 Structure tool window: Jump to Source (F4) does not move focus to Editor ed4794e: VcsRootDetector and RootErrorsFinder tests updated c196ab3: Remove unnecessary check and param from HgRepositoryImpl b486fcb: template actions are now injection aware 773f5f0: IDEA-102454 Parameter Info: TAB/Shift-TAB and editing does not work in language injected fragment 3b34a0b: IDEA-49273 Injected language: parameter info tooltip disappears on moving caret 7afa57d: move indexer to indexing-impl 4ab17a0: don't shift text range if the element has no last child (PY-11344) 9e3bbe9: don't show "inspect test source" checkbox in PyCharm (PY-1187) ac7f1b2: IDEA-113483 (action fixed to select directories too) 7bd9931: Emmet: extract SurroundWithEmmetAction 625e81b: don't show "production" and "test" scopes in predefined scopes if current product doesn't support test source roots (PY-7324) f01a713: grouping by directory uses project-relative paths (PY-11176); rename the action from "Group by package" to "Group by directory" in platform-based IDEs be45c85: move GeneralFormatterTest to platform-tests; fix NPE in DocumentImpl when running standalone GeneralFormatterTest 4d22f5e: DirectoryIndex: don't include roots from content to projectExcludeRoots set, update projectExcludeRoots on VFS change 02f7305: Merge branch 'master' of git.labs.intellij.net:idea/community 7994da2: External System: test fix Related task: IDEA-79466 gradle support should generate web module configuration e3cfba1: IDEA-116126 - NoClassDefFound on attempt to deploy to heroku 630eacf: Merge remote-tracking branch 'origin/master' a902c4e: testdata fixed db0433c: fix NPE — final class variable is not yet initialized — we must not open connection until debug process class is not constructed. dd2d5f6: platform: ensure event file validity on dropping symlink target eaeed33: platform: better pairing of before/after VFS events 97aec30: Cleanup (formatting) 017646f: remove dead code, cleanup 2181005: more templates ab315c8: new project wizard: template description & count e789a57: External system: adding TEST_GENERATED source type to ExternalSystemSourceType 62eeca9: new project wizard: adding project templates 25e633c: SimpleColoredComponent: builder style 84c2eb6: ColoredListCellRenderer parameterized 3c567ba: cleanup ab15886: cleanup aaad70d: cleanup 81c7d30: update Key.findKeyByName usages due to API changes 41ca0a4: CCE aware API fe3700f: java call hierarchy extension 51c76a3: Make view meta model extendable e17daa4: unused methods with strange names deprecated 4910498: service replaced by utility methods d0fd16f: faster for simple cases 3dd6919: fix CSS completion tests: if the reference starts at completion start location, we do need to overwrite it when Tab is pressed 22c1ef9: Gradle: update to Gradle 1.9-rc-3 7a38323: Pty4j updated. 29ac873: IDEA-97390 Java Debugger: View Text action shows white on white [2] 1c329ac: Merge branch 'master' of git.labs.intellij.net:idea/community 0c60dd9: IDEA-86998 Evaluate expression mixes colorschemas when displaying injected code ce6fbd9: IDEA-97390 Java Debugger: View Text action shows white on white a50bd7e: Merge branch 'master' of git.labs.intellij.net:idea/community 8de20e2: remote servers - headers cleanup c5e1cf7: don't reformat mock variable during control flow building 8e11281: don't walk module src roots in search for .class file source (IDEA-116085) 992d740: cache expected names (IDEA-116085) 10976b3: walk library src roots once when searching for class sources (IDEA-116085) dfc71fc: fix java pull up refactoring! 4af2a83: Merge remote-tracking branch 'origin/master' a818922: javadoc: include in classpath only libraries from modules which participate in the scope (IDEA-116083) 38e2991: new inference: do not use nested call args to infer on the top level 465762a: new inference: reject multiple eq bounds d84a0a0: Darcula eats almost all EDT cpu time fe23143: IDEA-94922 (Report negatively named boolean variables and suggest to perform 'Invert Boolean' for them) f637ac6: fix description 9005acd: common "invert boolean" quickfix 9a5bfa9: add #loc's dd94fc6: fix "No dependencies provided which causes CachedValue to be never recalculated again." e4cce36: java.lang.IllegalThreadStateException additional handling 1249362: disposed check 0495c47: cleanup 25fc653: extra inspections 8850957: IDEA-101405 Call hierarchy support for Groovy 3026341: hierarchy package deb52f5: Flat & round stripe buttons (Internal Mode only) v.3, colors improvement d903511: IDEA-116139 Workaround NPE fix 8fccc30: avoid assertion on file path completion (EA-51068) fdb9f6e: ctrl+w shouldn't choke on unclosed argument lists (EA-51589) 1de20e6: don't inc modification counter on first load of gant/gradle settings 8a9c177: IDEA-25934 Maven: Webapp resources filtering store web resource configuration. 9553c1a: catch all exceptions that may influence VM attach process aa8a8e8: IDEA-116146 Search everywhere has small font in Presentation mode 9c7d5d5: #WEB-8915 fixed 5d96196: dfa: flush resource variables when leaving try block 15c0fd6: jsr166e.jar included into standalone jps distribution edbde43: generics: bounds check should stop expanding nested wildcards up to 2nd level d991c73: fix invalid file assertion aae4c5a: IDEA-116049 Mercurial log problem with Mac default locale (x_MacRoman) 08a6b0c: Unnecessary encoding argument in new hg log removed. 5cd75d1: style 5a365fd: fix BooleanParameterInspectionTest 4e2e6ca: [log] IDEA-115966 Show HAND cursor over branch arrows 7793ca6: [log] Collect user information from the whole log 4e8c466: [log] Completion in filter by user bc4c9f8: [log] intern VcsUsers. 0505705: [log] Encapsulate author & committer into VcsUser 1fb280e: [log] Let VcsLogObjectsFactory be project service & depend on VcsLogManager 2f2f008: Gradle: add Tooling API extra models support. Related task: IDEA-79466 gradle support should generate web module configuration 3c9aa6d: convert EventLogCategory to abstract class 0804cb1: html5 char entities for fragments 0e50db9: #IDEA-116106 fixed 483a5d1: enable entities validation for html5 #WEB-7053 fixed 962e050: generated entities for html 5 chars, use it in resolve and completion b57823a: Merge remote-tracking branch 'origin/master' da8e5d0: we must add "http://" prefix if specified path is not absolute 6bb2810: small lens mode fix 88caaf7: Merge remote-tracking branch 'origin/master' 4268072: IDEA-116125 extra gutter in presentation mode 6d03a86: Eliminated dependencies on pthread, glib rec mutex synchronization. A crash fixed. b5f05f4: Quick fix for not Unity window managers. Should be moved into linux-specific code. fe27876: WI-14476 When hovering over variable, Expression Evaluation tooltip disappears before I can click the + icon (cherry picked from commit 3034e98) 202e2ae: Cleanup (test) a5960af: java: no need to check package prefix for annotations on ref adjustment ab262e2: Cleanup (test) 5b2a86b: IDEA-89720 Preview usages: "select usages to preview" should be shown at the center of panel 7b82bf1: IDEA-116119 Darcula: links are hardly visible on warnings d2a2cd9: don't hide run configuration type if there are only one irrelevant type (IDEA-116046) 15e08d4: javadoc corrected 5575eb1: hide 'deploy to cloud' run configurations if corresponding cloud isn't configured (IDEA-116046) 3b3c221: WEB-9876 Fuzzy search is still colliding with completion 50bd840: Spock method should be a GrMethod. 5364513: exception-safe rendering 544a580: thread assertion fix bc4c101: fix NPEs 56940f1: a way to increase dismiss delay 9aee54e: framework version from existing library 37f430f: removing borders automatically 19a21fd: new "Non-varargs method overrides varargs method" inspection e82e54d: improve description 31fedec: New in 13 0fbffa1: fixed downloading client libraries from modal dialog (IDEA-115975) 5db09f5: CCE from android step fixed cded14f: IDEA-115064 New Project Wizard: Spring page looks bad: preselected frameworks e6b1f8e: fix NPE (request status) 8bba7c9: IDEA-115076 Groovy: New Project Wizard: IAE at DialogWrapperPeerFactoryImpl.createPeer() on 'Create Groovy Library' 5a47ef8: app server editor: don't show 'change version' button for app server library f510156: IDEA-115398 New Project Wizard: libraries downloading doesn't work 3d251be: event log category EP 7d76939: Take shortcuts for next tab and prev tabs from keymap. be19e2e: Next tab and Previous tab actions. 67310ba: Null class name tolerated db170d7: Fixed text shaking on tab name editing. bd3c4bc: Some cleanup. b27ba6e: IDEA-112596 SQL: MySQL uncomment doesn't work with "--" a67dac8: IDEA-115954 lens mode warning annotation bubbles overlap text on retina b6c179c: IDEA-93733 Double line above editor tabs 2c91f79: EA-51491 - assert: DocumentImpl.createRangeMarker 1743e7b: EA-51650 - assert: JavaDocInfoGenerator.getDocComment 16712b8: Todo f9d2c43: Cleanup (formatting) 38f058d: failing test for PY-10319 dd3f3fa: rename some methods and cleanup code to make logic clearer aa885ea: report missing identifier after 'as' (PY-9853) 52efcb5: only allow single expression after 'in'; tweak error recovery when waiting for colon (PY-9561) 7f8dc3d: change default match-from-start to false bfb1819: EA-51669 (unneeded augmentation avoided) b27e492: platform: extension point declaration moved to correct .xml 4d9e686: sourcemaps: ability to resolve sources relative to generated file 40e08dc: Fix the size changing of text field for terminal tabs. 62223eb: Merge remote-tracking branch 'origin/master' 6c84d33: take synchronized statements into account when mapping local variable names to slots 4e560b6: allow to view hidden items in 'New Run Configuration' popup (IDEA-116046) 37caefe: IDEA-72889 (CodeStyle inspection to check tabs instead of spaces in file) f345cfd: EA-51469: do not call GemManager.updateGemset(Module) with null e27287d: ShowSettingUtil: selecting configurable by class is fixed b9f0e95: new inference: infer recursively for conditional expression 646aea3: new inference: avoid self bounds when possible a2ad6fd: new inference: accept captured wildcard opening during subtype constraint reduction 66462d0: remove incorrect copyright messages c3c03a0: don't set default cursor if empty text is invisible 4f009e8: IDEA-115398 New Project Wizard: libraries downloading doesn't work 3607191: Merge remote-tracking branch 'origin/master' a95509a: extracted method to get/set 'for generated source' option via API 7b00b8f: hide Groovy run configuration if there are no groovy files in project (IDEA-116046) 89f2a76: Minor VFS optimization (cleanup) 0defb40: less spam in the logs when there's PSI/document inconsistency during reference search (IDEA-115950) 29427e7: added service to quickly find modules by module type; hide DevKit and J2ME run configurations if there are no corresponding modules (IDEA-116046) d031ebc: hide Python run configurations if they are irrelevant (IDEA-116046) 75ca45a: IDEA-116000 Error message shown if hg root marked as git e9b3a8c: style 24f91c2: IDEA-115474 Maven Dependency template broken in latest Idea Cardea 26b5659: added API to hide irrelevant run configuration types from 'New' popup in 'Edit Configurations' dialog (IDEA-116046) 5b6b259: Merge remote-tracking branch 'origin/master' 0525b10: Revert the change. 4f9d3f0: Disable formatter ranges in formatter off/on tags [CR-IC-2916] f760c44: IDEA-36685: Provide better 'no matching constructor' warnings where possible 915fb35a: new overload resolution: testdata 3546317: new overload resolution 971909a: method refs: exact tweaks f6932ac: Merge remote-tracking branch 'origin/master' c22e14c: JediTerm jar updated. 08eed1d: Merge remote-tracking branch 'origin/master' 5ff6e1a: Merge remote-tracking branch 'origin/master' feec183: Pty4j with debug info. 08c90e8: Minor VFS optimization 53a81a0: Cleanup (formatting) dc52633: EA-50578 - assert: TextRange.<init> b532d92: Merge remote-tracking branch 'origin/master' aa20e7d: status bar should have a height at least of an icon, even before any icons appear, to prevent unnecessary blinking (IDEA-114453) 1e0e31e: IDEA-112982 Status bar starts with bad layout before project is fully loaded default min height was 1 which made BoxLayout center-align everything along the top border resulting in 2x less memory indicator height 5fdc8f8: Merge branch 'svn_18_2' cc6dd17: svn: Fixed destroy for process under terminal 9826ae7: external system: EA-51656, check for disposable project components added 7337a62: external system: EA-51656, check for disposable project components added ea5159b: IDEA-116001 Incorrect behavior of root scanner in case non hg project marked as hg fixed 2186112: Merge remote-tracking branch 'origin/master' 9f02f7e: don't generate icons for IntelliJ laf 0f252a9: IDEA-90751 Scope tabs coloring does not affect hidden tabs pop-up ab0e88a: cleanup dead code 79bf40e: IDEA-114608 breakpoints dialog: add panel must be at top d9b94c5: new icons: vendors & sql structure view 5b4b9a7: svn: Do not read from error stream for process under terminal ca6a8ac: drop command wrapper 5617a42: use correct date format in command to fix reverting changes on file with a sticky date afbef4d: new inference: mark List::get as inexact 4fde439: EA-51621 - IOE: CheckUtil.checkWritable eb79b67: EA-51643 - assert: DataManagerImpl$MyDataContext.getData e1b69a4: new inference: exact method reference: decline constructor with parameter with type parameter of class 664ee85: improve parser recovery if keyword is used as function or class name (PY-8319) 5d6bac5: improve parser recovery if keyword is used as named parameter (PY-8318) ce1ff5d: if we have only one import candidate, show its name instead of "import this name" (PY-8067) 27c5fbb: Visual Studio keymap maps Shift+F1 to both QuickJavaDoc and ExternalJavaDoc (PY-7291) baaf551: rename file when renaming class if file name equals lowercased class name (PY-7155) f52709b: tweak decorator parsing so that following line comment is outside the text range of PyDecorator (PY-5912) a61112a: don't overwrite reference by Tab if it starts exactly after reference being completed (PY-6095) 12249d1: tab completion for keyword arguments overwrites the = sign (PY-1337( a351f53: highlight only the last line of string literal when triple quotes are unclosed (PY-1780); allow running StringLiteralQuotesAnnotator in dumb mode 1bf4336: consistent behavior of PyFunction.getContainingClass() in stub-based and non-stub-based cases (PY-1448) 36c20c2: fix caret position after pressing Enter in Python line comment e55c85f: fix HtmlCompletionTest.testDotTypeWhileActiveLookupInFileReference a3e89bc: IntelliLang PatternValidator: class parsing errors should not fail the build if the class is not going to be instrumented by the validator. Covered 2 more cases when this check was not performed (IDEA-115189 IntelliLang Pattern Validator: Class not found) 6f7b23e: Merge remote-tracking branch 'origin/master' c5d7ccd: Merge remote-tracking branch 'origin/master' 946d9ab: svn: terminal: Implemented handling of "unknown host" prompt for ssh f1e1ceb: IDEA-113191 Used "write" access to sqlite db and try to access db several times if failed b95367c: svn: Do not handle auth errors when command is finished if in terminal mode e306801: svn: terminal: Added separate logging for status command output (as there are some issues with terminal output parsing) f22a4ed: svn: terminal: Implemented cancelling authentication prompts 4e7c774: svn: terminal: Treat stdout lines with svn errors as stderr lines a48733d: svn: Fixed default focused element for credentials dialog opening (password is focused if username is disabled) aac45e5: svn: Implemented password prompts for ssh authentication through terminal b8768d1: svn: Implemented basic svn+ssh authentication using terminal (under svn.use.terminal registry key) 13a217b: svn: Refactored CommandExecutor - ability to write to process input stream, small changes for inheritors e9ccca6: svn: Moved setting "non-interactive" mode when command executor is created 4092ffa: svn: Added command logging in for non-zero exit code 8441324: Tab name length is limited by 50 in jediterm library. 1c63154: Use JB tabs in terminal(PY-10609). Pass disposable to terminal widget. 2ba2163: Extract method that sets content to the holder. 9c5a392: NPE (IDEA-115607). Change-Id: I83d19d7826b59dbc1d782247b78553b4632e7635
Diffstat (limited to 'java')
-rw-r--r--java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java2
-rw-r--r--java/compiler/impl/src/com/intellij/packaging/impl/ui/actions/PackageFileWorker.java1
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/actions/AutoRendererAction.java31
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/actions/ThreadDumpAction.java31
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/impl/DebuggerContextImpl.java3
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/impl/InvokeThread.java24
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/jdi/ThreadReferenceProxyImpl.java10
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/jdi/VirtualMachineProxyImpl.java13
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/ui/PositionHighlighter.java5
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointNameCellRenderer.java60
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointTable.java123
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointTableModel.java161
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointTree.java824
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/ui/impl/DebuggerTreeRenderer.java47
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/ArgumentValueDescriptorImpl.java21
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/DebuggerTreeNodeImpl.java2
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/FieldDescriptorImpl.java51
-rw-r--r--java/idea-ui/src/com/intellij/facet/impl/ui/libraries/LibraryOptionsPanel.java32
-rw-r--r--java/idea-ui/src/com/intellij/ide/projectWizard/NewProjectWizard.java2
-rw-r--r--java/idea-ui/src/com/intellij/ide/projectWizard/ProjectCategory.java4
-rw-r--r--java/idea-ui/src/com/intellij/ide/projectWizard/ProjectSummaryStep.form26
-rw-r--r--java/idea-ui/src/com/intellij/ide/projectWizard/ProjectSummaryStep.java58
-rw-r--r--java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypeStep.form24
-rw-r--r--java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypeStep.java270
-rw-r--r--java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypesList.java8
-rw-r--r--java/idea-ui/src/com/intellij/ide/projectWizard/TemplateBasedProjectType.java5
-rw-r--r--java/idea-ui/src/com/intellij/ide/util/newProjectWizard/AbstractProjectWizard.java31
-rw-r--r--java/idea-ui/src/com/intellij/ide/util/newProjectWizard/AddModuleWizard.java10
-rw-r--r--java/idea-ui/src/com/intellij/ide/util/newProjectWizard/AddSupportForFrameworksPanel.java28
-rw-r--r--java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworkSupportOptionsComponent.java2
-rw-r--r--java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworksTree.java5
-rw-r--r--java/idea-ui/src/com/intellij/ide/util/newProjectWizard/LoadingProjectTemplate.java2
-rw-r--r--java/idea-ui/src/com/intellij/ide/util/newProjectWizard/ProjectTypesList.java2
-rw-r--r--java/idea-ui/src/com/intellij/ide/util/newProjectWizard/SelectTemplateStep.java1
-rw-r--r--java/idea-ui/src/com/intellij/ide/util/newProjectWizard/impl/FrameworkSupportModelBase.java14
-rw-r--r--java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/ExistingLibraryEditor.java11
-rw-r--r--java/idea-ui/src/com/intellij/platform/templates/ArchivedProjectTemplate.java9
-rw-r--r--java/idea-ui/src/com/intellij/platform/templates/ArchivedTemplatesFactory.java16
-rw-r--r--java/idea-ui/src/com/intellij/platform/templates/LocalArchivedTemplate.java11
-rw-r--r--java/idea-ui/src/com/intellij/platform/templates/RemoteTemplatesFactory.java2
-rw-r--r--java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightClassUtil.java1
-rw-r--r--java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java19
-rw-r--r--java/java-analysis-impl/src/com/intellij/codeInspection/miscGenerics/RedundantTypeArgsInspection.java2
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/ExpectedTypeInfoImpl.java21
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java20
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/completion/AllClassesGetter.java5
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionSorting.java4
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionStatistician.java2
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/editorActions/wordSelection/ListSelectioner.java4
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/generation/ui/GenerateEqualsWizard.java7
-rw-r--r--java/java-impl/src/com/intellij/externalSystem/JavaProjectDataService.java5
-rw-r--r--java/java-impl/src/com/intellij/ide/hierarchy/call/CallHierarchyNodeDescriptor.java14
-rw-r--r--java/java-impl/src/com/intellij/ide/hierarchy/call/CallerMethodsTreeStructure.java67
-rw-r--r--java/java-impl/src/com/intellij/ide/hierarchy/call/JavaCallReferenceProcessor.java103
-rw-r--r--java/java-impl/src/com/intellij/ide/projectView/actions/MarkGeneratedSourceRootAction.java69
-rw-r--r--java/java-impl/src/com/intellij/ide/projectView/actions/UnmarkGeneratedSourceRootAction.java55
-rw-r--r--java/java-impl/src/com/intellij/javadoc/JavadocConfiguration.java17
-rw-r--r--java/java-impl/src/com/intellij/openapi/roots/JavaGeneratedSourcesFilter.java30
-rw-r--r--java/java-impl/src/com/intellij/openapi/roots/JavaProjectRootsUtil.java27
-rw-r--r--java/java-impl/src/com/intellij/psi/impl/JavaPsiImplementationHelperImpl.java25
-rw-r--r--java/java-impl/src/com/intellij/psi/impl/source/codeStyle/JavaReferenceAdjuster.java9
-rw-r--r--java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java1
-rw-r--r--java/java-impl/src/com/intellij/refactoring/invertBoolean/InvertBooleanHandler.java12
-rw-r--r--java/java-impl/src/com/intellij/slicer/SliceForwardUtil.java4
-rw-r--r--java/java-impl/src/com/intellij/spi/psi/SPIClassProviderReferenceElement.java10
-rw-r--r--java/java-impl/src/com/intellij/usageView/UsageContextDataflowToPanel.java2
-rw-r--r--java/java-impl/src/com/intellij/usages/impl/rules/PackageGroupingRule.java6
-rw-r--r--java/java-psi-api/src/com/intellij/psi/GenericsUtil.java40
-rw-r--r--java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceUtil.java5
-rw-r--r--java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java17
-rw-r--r--java/java-psi-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java3
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/PsiElementFactoryImpl.java5
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/PsiImplUtil.java1
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/ProcessCandidateParameterTypeInferencePolicy.java3
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java87
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/PsiGraphInferenceHelper.java8
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/ExpressionCompatibilityConstraint.java14
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/SubtypingConstraint.java5
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiMethodReferenceExpressionImpl.java42
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl.java11
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/scope/conflictResolvers/JavaMethodsConflictResolver.java8
-rw-r--r--java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA57492.java4
-rw-r--r--java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA94011.java2
-rw-r--r--java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IntersectionTypes.java2
-rw-r--r--java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/InferenceFromReturnType.java4
-rw-r--r--java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/MethodTypeParamsInference.java2
-rw-r--r--java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/RawQualifier.java2
-rw-r--r--java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/ReturnTypeSpecific.java4
-rw-r--r--java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/StaticProblems.java8
-rw-r--r--java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorMatchingSuper/beforeInAnonymous.java13
-rw-r--r--java/java-tests/testData/inspection/dataFlow/fixture/PrimitiveCastMayChangeValue.java15
-rw-r--r--java/java-tests/testData/psi/formatter/java/FormatterOnOffTags.java37
-rw-r--r--java/java-tests/testData/psi/formatter/java/FormatterOnOffTags_after.java38
-rw-r--r--java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java2
-rw-r--r--java/java-tests/testSrc/com/intellij/codeInsight/intention/AddImportActionTest.groovy20
-rw-r--r--java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java1
-rw-r--r--java/java-tests/testSrc/com/intellij/find/FindManagerTest.java225
-rw-r--r--java/java-tests/testSrc/com/intellij/openapi/roots/impl/DirectoryIndexTest.java20
-rw-r--r--java/java-tests/testSrc/com/intellij/psi/StubAstSwitchTest.groovy4
-rw-r--r--java/openapi/src/com/intellij/ide/hierarchy/call/CallReferenceProcessor.java35
-rw-r--r--java/openapi/src/com/intellij/ide/hierarchy/call/JavaCallHierarchyData.java91
-rw-r--r--java/testFramework/src/com/intellij/codeInsight/CodeInsightTestCase.java49
-rw-r--r--java/testFramework/src/com/intellij/find/FindManagerTestUtils.java (renamed from java/java-tests/testSrc/com/intellij/find/FindManagerTestUtils.java)22
103 files changed, 1509 insertions, 1863 deletions
diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java b/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java
index b644c8a4c86d..6655fe863fad 100644
--- a/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java
+++ b/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java
@@ -913,7 +913,7 @@ public class CompileDriver {
lfs.refreshIoFiles(outputs, _status == ExitStatus.CANCELLED, false, null);
indicator.setText("");
}
- if (compileContext.isAnnotationProcessorsEnabled()) {
+ if (compileContext.isAnnotationProcessorsEnabled() && !myProject.isDisposed()) {
final Set<File> genSourceRoots = new THashSet<File>(FileUtil.FILE_HASHING_STRATEGY);
final CompilerConfiguration config = CompilerConfiguration.getInstance(myProject);
for (Module module : affectedModules) {
diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/ui/actions/PackageFileWorker.java b/java/compiler/impl/src/com/intellij/packaging/impl/ui/actions/PackageFileWorker.java
index 242899017cd9..8f815f35c40c 100644
--- a/java/compiler/impl/src/com/intellij/packaging/impl/ui/actions/PackageFileWorker.java
+++ b/java/compiler/impl/src/com/intellij/packaging/impl/ui/actions/PackageFileWorker.java
@@ -87,6 +87,7 @@ public class PackageFileWorker {
for (final VirtualFile file : files) {
indicator.checkCanceled();
new ReadAction() {
+ @Override
protected void run(final Result result) {
try {
packageFile(file, project, artifacts, packIntoArchives);
diff --git a/java/debugger/impl/src/com/intellij/debugger/actions/AutoRendererAction.java b/java/debugger/impl/src/com/intellij/debugger/actions/AutoRendererAction.java
index 1891a7749a23..1d1537f93c9e 100644
--- a/java/debugger/impl/src/com/intellij/debugger/actions/AutoRendererAction.java
+++ b/java/debugger/impl/src/com/intellij/debugger/actions/AutoRendererAction.java
@@ -15,6 +15,7 @@
*/
package com.intellij.debugger.actions;
+import com.intellij.debugger.engine.DebugProcessImpl;
import com.intellij.debugger.engine.events.DebuggerContextCommandImpl;
import com.intellij.debugger.impl.DebuggerContextImpl;
import com.intellij.debugger.ui.impl.watch.DebuggerTreeNodeImpl;
@@ -26,21 +27,25 @@ import com.intellij.openapi.actionSystem.AnActionEvent;
public class AutoRendererAction extends AnAction{
public void actionPerformed(AnActionEvent e) {
final DebuggerContextImpl debuggerContext = DebuggerAction.getDebuggerContext(e.getDataContext());
- final DebuggerTreeNodeImpl[] selectedNodes = DebuggerAction.getSelectedNodes(e.getDataContext());
- if(debuggerContext != null && debuggerContext.getDebugProcess() != null) {
- debuggerContext.getDebugProcess().getManagerThread().schedule(new DebuggerContextCommandImpl(debuggerContext) {
- public void threadAction() {
- for (int i = 0; i < selectedNodes.length; i++) {
- DebuggerTreeNodeImpl selectedNode = selectedNodes[i];
- NodeDescriptorImpl descriptor = selectedNode.getDescriptor();
- if (descriptor instanceof ValueDescriptorImpl) {
- ((ValueDescriptorImpl) descriptor).setRenderer(null);
- selectedNode.calcRepresentation();
+ if(debuggerContext != null) {
+ final DebugProcessImpl debugProcess = debuggerContext.getDebugProcess();
+ if(debugProcess != null) {
+ final DebuggerTreeNodeImpl[] selectedNodes = DebuggerAction.getSelectedNodes(e.getDataContext());
+ if (selectedNodes != null) {
+ debugProcess.getManagerThread().schedule(new DebuggerContextCommandImpl(debuggerContext) {
+ public void threadAction() {
+ for (DebuggerTreeNodeImpl selectedNode : selectedNodes) {
+ final NodeDescriptorImpl descriptor = selectedNode.getDescriptor();
+ if (descriptor instanceof ValueDescriptorImpl) {
+ ((ValueDescriptorImpl)descriptor).setRenderer(null);
+ selectedNode.calcRepresentation();
+ }
+ }
}
- }
- }
- });
+ });
+ }
+ }
}
}
}
diff --git a/java/debugger/impl/src/com/intellij/debugger/actions/ThreadDumpAction.java b/java/debugger/impl/src/com/intellij/debugger/actions/ThreadDumpAction.java
index ac513d7a40b9..a4fe426088f7 100644
--- a/java/debugger/impl/src/com/intellij/debugger/actions/ThreadDumpAction.java
+++ b/java/debugger/impl/src/com/intellij/debugger/actions/ThreadDumpAction.java
@@ -33,7 +33,6 @@ import com.intellij.debugger.ui.DebuggerSessionTab;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.CommonDataKeys;
-import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.actionSystem.Presentation;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ModalityState;
@@ -298,12 +297,30 @@ public class ThreadDumpAction extends AnAction implements AnAction.TransparentUp
catch (Throwable e) {
sourceName = "Unknown Source";
}
- return DebuggerBundle.message(
- "export.threads.stackframe.format",
- location.declaringType().name() + "." + location.method().name(),
- sourceName,
- location.lineNumber()
- );
+
+ final StringBuilder methodName = new StringBuilder();
+ try {
+ methodName.append(location.declaringType().name());
+ }
+ catch (Throwable e) {
+ methodName.append(e.getMessage());
+ }
+ methodName.append(".");
+ try {
+ methodName.append(location.method().name());
+ }
+ catch (Throwable e) {
+ methodName.append(e.getMessage());
+ }
+
+ int lineNumber;
+ try {
+ lineNumber = location.lineNumber();
+ }
+ catch (Throwable e) {
+ lineNumber = -1;
+ }
+ return DebuggerBundle.message("export.threads.stackframe.format", methodName.toString(), sourceName, lineNumber);
}
private static String threadName(ThreadReference threadReference) {
diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerContextImpl.java b/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerContextImpl.java
index d353368f9e69..e35ba834a9b5 100644
--- a/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerContextImpl.java
+++ b/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerContextImpl.java
@@ -171,6 +171,7 @@ public final class DebuggerContextImpl implements DebuggerContext {
}
public boolean isEvaluationPossible() {
- return getDebugProcess().getSuspendManager().getPausedContext() != null;
+ final DebugProcessImpl debugProcess = getDebugProcess();
+ return debugProcess != null && debugProcess.getSuspendManager().getPausedContext() != null;
}
} \ No newline at end of file
diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/InvokeThread.java b/java/debugger/impl/src/com/intellij/debugger/impl/InvokeThread.java
index 84ed7306912a..804799dd9301 100644
--- a/java/debugger/impl/src/com/intellij/debugger/impl/InvokeThread.java
+++ b/java/debugger/impl/src/com/intellij/debugger/impl/InvokeThread.java
@@ -34,6 +34,7 @@ public abstract class InvokeThread<E extends PrioritizedTask> {
public static final class WorkerThreadRequest<E extends PrioritizedTask> implements Runnable {
private final InvokeThread<E> myOwner;
private volatile Future<?> myRequestFuture;
+ private volatile boolean myStopRequested = false;
WorkerThreadRequest(InvokeThread<E> owner) {
myOwner = owner;
@@ -60,13 +61,16 @@ public abstract class InvokeThread<E extends PrioritizedTask> {
}
public void interrupt() {
- assert myRequestFuture != null;
- myRequestFuture.cancel( true );
+ final Future<?> future = myRequestFuture;
+ assert future != null;
+ myStopRequested = true;
+ future.cancel(true);
}
public boolean isInterrupted() {
- assert myRequestFuture != null;
- return myRequestFuture.isCancelled() || myRequestFuture.isDone();
+ final Future<?> future = myRequestFuture;
+ assert future != null;
+ return myStopRequested || future.isCancelled() || future.isDone();
}
public void join() throws InterruptedException, ExecutionException {
@@ -189,15 +193,15 @@ public abstract class InvokeThread<E extends PrioritizedTask> {
return myEvents.pushBack(r, r.getPriority().ordinal());
}
- protected void switchToRequest(WorkerThreadRequest newWorkerThread) {
- final WorkerThreadRequest request = getCurrentThreadRequest();
- LOG.assertTrue(request != null);
- myCurrentRequest = newWorkerThread;
+ protected void switchToRequest(WorkerThreadRequest newRequest) {
+ final WorkerThreadRequest currentThreadRequest = getCurrentThreadRequest();
+ LOG.assertTrue(currentThreadRequest != null);
+ myCurrentRequest = newRequest;
if (LOG.isDebugEnabled()) {
- LOG.debug("Closing " + request + " new request = " + newWorkerThread);
+ LOG.debug("Closing " + currentThreadRequest + " new request = " + newRequest);
}
- request.interrupt();
+ currentThreadRequest.interrupt();
}
public WorkerThreadRequest getCurrentRequest() {
diff --git a/java/debugger/impl/src/com/intellij/debugger/jdi/ThreadReferenceProxyImpl.java b/java/debugger/impl/src/com/intellij/debugger/jdi/ThreadReferenceProxyImpl.java
index 25d08bb63732..38140c698382 100644
--- a/java/debugger/impl/src/com/intellij/debugger/jdi/ThreadReferenceProxyImpl.java
+++ b/java/debugger/impl/src/com/intellij/debugger/jdi/ThreadReferenceProxyImpl.java
@@ -171,7 +171,15 @@ public final class ThreadReferenceProxyImpl extends ObjectReferenceProxyImpl imp
myFrameCount = 0;
}
catch (IncompatibleThreadStateException e) {
- if (!threadReference.isSuspended()) {
+ final boolean isSuspended;
+ try {
+ isSuspended = threadReference.isSuspended();
+ }
+ catch (Throwable th) {
+ // unable to determine whether the thread is actually suspended, so propagating original exception
+ throw EvaluateExceptionUtil.createEvaluateException(e);
+ }
+ if (!isSuspended) {
// give up because it seems to be really resumed
throw EvaluateExceptionUtil.createEvaluateException(e);
}
diff --git a/java/debugger/impl/src/com/intellij/debugger/jdi/VirtualMachineProxyImpl.java b/java/debugger/impl/src/com/intellij/debugger/jdi/VirtualMachineProxyImpl.java
index 109b51ec507e..345637ba9efd 100644
--- a/java/debugger/impl/src/com/intellij/debugger/jdi/VirtualMachineProxyImpl.java
+++ b/java/debugger/impl/src/com/intellij/debugger/jdi/VirtualMachineProxyImpl.java
@@ -68,7 +68,18 @@ public class VirtualMachineProxyImpl implements JdiTimer, VirtualMachineProxy {
canWatchFieldModification();
canPopFrames();
- virtualMachine.allClasses(); // this will cache classes inside JDI and enable faster search of classes later
+ try {
+ // this will cache classes inside JDI and enable faster search of classes later
+ virtualMachine.allClasses();
+ }
+ catch (Throwable e) {
+ // catch all exceptions in order not to break vm attach process
+ // Example:
+ // java.lang.IllegalArgumentException: Invalid JNI signature character ';'
+ // caused by some bytecode "optimizers" which break type signatures as a side effect.
+ // solution if you are using JAX-WS: add -Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize=true to JVM args
+ LOG.info(e);
+ }
List<ThreadGroupReference> groups = virtualMachine.topLevelThreadGroups();
for (ThreadGroupReference threadGroupReference : groups) {
diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/PositionHighlighter.java b/java/debugger/impl/src/com/intellij/debugger/ui/PositionHighlighter.java
index 1339e9c9bc0d..fa91c9b60141 100644
--- a/java/debugger/impl/src/com/intellij/debugger/ui/PositionHighlighter.java
+++ b/java/debugger/impl/src/com/intellij/debugger/ui/PositionHighlighter.java
@@ -15,7 +15,6 @@
*/
package com.intellij.debugger.ui;
-import com.intellij.codeInsight.daemon.impl.DaemonListeners;
import com.intellij.debugger.DebuggerBundle;
import com.intellij.debugger.DebuggerInvocationUtil;
import com.intellij.debugger.SourcePosition;
@@ -131,9 +130,9 @@ public class PositionHighlighter {
private static void adjustCounter(@NotNull Editor editor, int increment) {
JComponent component = editor.getComponent();
- Object o = component.getClientProperty(DaemonListeners.IGNORE_MOUSE_TRACKING);
+ Object o = component.getClientProperty(Editor.IGNORE_MOUSE_TRACKING);
Integer value = ((o instanceof Integer) ? (Integer)o : 0) + increment;
- component.putClientProperty(DaemonListeners.IGNORE_MOUSE_TRACKING, value > 0 ? value : null);
+ component.putClientProperty(Editor.IGNORE_MOUSE_TRACKING, value > 0 ? value : null);
}
public void remove() {
diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointNameCellRenderer.java b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointNameCellRenderer.java
deleted file mode 100644
index eac638e656da..000000000000
--- a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointNameCellRenderer.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright 2000-2009 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.intellij.debugger.ui.breakpoints;
-
-import com.intellij.util.ui.UIUtil;
-
-import javax.swing.*;
-import javax.swing.table.DefaultTableCellRenderer;
-import java.awt.*;
-
-/**
- * @author Jeka
- */
-public class BreakpointNameCellRenderer extends DefaultTableCellRenderer {
- private final Color myAnyExceptionForeground = new Color(128, 0, 0);
-
- public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
- super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
- setBorder(null);
- BreakpointTableModel tableModel = (BreakpointTableModel)table.getModel();
- Breakpoint breakpoint = tableModel.getBreakpoint(row);
- if (breakpoint == null){
- return this;
- };
- final Icon icon = (breakpoint instanceof BreakpointWithHighlighter)?
- breakpoint.ENABLED? ((BreakpointWithHighlighter)breakpoint).getSetIcon(false) : ((BreakpointWithHighlighter)breakpoint).getDisabledIcon(
- false) : breakpoint.getIcon();
- setIcon(icon);
- setDisabledIcon(icon);
-
- if(isSelected){
- setForeground(UIUtil.getTableSelectionForeground());
- }
- else{
- Color foreColor;
- if(breakpoint instanceof AnyExceptionBreakpoint){
- foreColor = myAnyExceptionForeground;
- }
- else{
- foreColor = UIUtil.getTableForeground();
- }
- setForeground(foreColor);
- }
- setEnabled(isSelected || breakpoint.ENABLED);
- return this;
- }
-}
diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointTable.java b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointTable.java
deleted file mode 100644
index 7530fa524e52..000000000000
--- a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointTable.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright 2000-2009 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.intellij.debugger.ui.breakpoints;
-
-import com.intellij.openapi.project.Project;
-import com.intellij.util.ui.Table;
-import com.intellij.xdebugger.XDebuggerBundle;
-
-import javax.swing.*;
-import javax.swing.table.DefaultTableCellRenderer;
-import javax.swing.table.TableCellRenderer;
-import javax.swing.table.TableColumn;
-import javax.swing.table.TableColumnModel;
-import java.awt.*;
-import java.awt.event.ActionEvent;
-import java.awt.event.KeyEvent;
-
-/**
- * @author Eugene Zhuravlev
- * Date: May 23, 2005
- */
-public class BreakpointTable extends Table {
- public BreakpointTable(final Project project) {
- super(new BreakpointTableModel(project));
- setColumnSelectionAllowed(false);
- InputMap inputMap = getInputMap();
- ActionMap actionMap = getActionMap();
- Object o = inputMap.get(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0));
- if (o == null) {
- //noinspection HardCodedStringLiteral
- o = "enable_disable";
- inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), o);
- }
- actionMap.put(o, new AbstractAction() {
- public void actionPerformed(ActionEvent e) {
- if (isEditing()) {
- return;
- }
- int[] indices = getSelectedRows();
- boolean currentlyMarked = true;
- for (int i = 0; i < indices.length; i++) {
- final Boolean isMarked = (Boolean)getValueAt(indices[i], BreakpointTableModel.ENABLED_STATE);
- currentlyMarked = isMarked != null? isMarked.booleanValue() : false;
- if (!currentlyMarked) {
- break;
- }
- }
- final Boolean valueToSet = currentlyMarked ? Boolean.FALSE : Boolean.TRUE;
- for (int i = 0; i < indices.length; i++) {
- setValueAt(valueToSet, indices[i], BreakpointTableModel.ENABLED_STATE);
- }
- }
- });
-
- setShowGrid(false);
- setIntercellSpacing(new Dimension(0, 0));
- setTableHeader(null);
- setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
- setColumnSelectionAllowed(false);
-
- int width = new JCheckBox().getPreferredSize().width;
- TableColumnModel columnModel = getColumnModel();
-
- TableColumn enabledStateColumn = columnModel.getColumn(BreakpointTableModel.ENABLED_STATE);
- enabledStateColumn.setPreferredWidth(width);
- enabledStateColumn.setMaxWidth(width);
- final Class enabledStateColumnClass = getModel().getColumnClass(BreakpointTableModel.ENABLED_STATE);
- final TableCellRenderer delegateRenderer = getDefaultRenderer(enabledStateColumnClass);
- setDefaultRenderer(enabledStateColumnClass, new DefaultTableCellRenderer() {
- public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
- final Component component = delegateRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
- if (component instanceof JComponent) {
- ((JComponent)component).setBorder(null);
- }
- return component;
- }
- });
- columnModel.getColumn(BreakpointTableModel.NAME).setCellRenderer(new BreakpointNameCellRenderer());
-
- getEmptyText().setText(XDebuggerBundle.message("debugger.no.breakpoints"));
- }
-
- public BreakpointTableModel getModel() {
- return (BreakpointTableModel)super.getModel();
- }
-
- public void setBreakpoints(Breakpoint[] breakpoints) {
- getModel().setBreakpoints(breakpoints);
- }
-
- public final java.util.List<Breakpoint> getBreakpoints() {
- return getModel().getBreakpoints();
- }
-
- public Breakpoint[] getSelectedBreakpoints() {
- if (getRowCount() == 0) {
- return Breakpoint.EMPTY_ARRAY;
- }
-
- int[] rows = getSelectedRows();
- if (rows.length == 0) {
- return Breakpoint.EMPTY_ARRAY;
- }
- Breakpoint[] rv = new Breakpoint[rows.length];
- for (int idx = 0; idx < rows.length; idx++) {
- rv[idx] = getModel().getBreakpoint(rows[idx]);
- }
- return rv;
- }
-}
diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointTableModel.java b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointTableModel.java
deleted file mode 100644
index 6999260ec9df..000000000000
--- a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointTableModel.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Copyright 2000-2009 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * Class BreakpointTableModel
- * @author Jeka
- */
-package com.intellij.debugger.ui.breakpoints;
-
-import com.intellij.debugger.DebuggerBundle;
-import com.intellij.debugger.DebuggerManagerEx;
-import com.intellij.openapi.project.Project;
-import com.intellij.util.containers.ContainerUtil;
-import com.intellij.util.ui.ItemRemovable;
-
-import javax.swing.table.AbstractTableModel;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-public class BreakpointTableModel extends AbstractTableModel implements ItemRemovable {
- public static final int ENABLED_STATE = 0;
- public static final int NAME = 1;
-
- private java.util.List<Breakpoint> myBreakpoints = null;
- private final BreakpointManager myBreakpointManager;
-
- public BreakpointTableModel(final Project project) {
- myBreakpoints = new ArrayList<Breakpoint>();
- myBreakpointManager = DebuggerManagerEx.getInstanceEx(project).getBreakpointManager();
- }
-
- public final void setBreakpoints(Breakpoint[] breakpoints) {
- myBreakpoints.clear();
- if (breakpoints != null) {
- ContainerUtil.addAll(myBreakpoints, breakpoints);
- }
- fireTableDataChanged();
- }
-
- public List<Breakpoint> getBreakpoints() {
- return Collections.unmodifiableList(myBreakpoints);
- }
-
- public void removeBreakpoints(Breakpoint[] breakpoints) {
- myBreakpoints.removeAll(Arrays.asList(breakpoints));
- fireTableDataChanged();
- }
-
- public Breakpoint getBreakpoint(int index) {
- if (index < 0 || index >= myBreakpoints.size()) return null;
- return myBreakpoints.get(index);
- }
-
- public boolean isBreakpointEnabled(int index) {
- return ((Boolean)getValueAt(index, ENABLED_STATE)).booleanValue();
- }
-
- public int getBreakpointIndex(Breakpoint breakpoint) {
- return myBreakpoints.indexOf(breakpoint);
- }
-
- public void insertBreakpointAt(Breakpoint breakpoint, int index) {
- myBreakpoints.add(index, breakpoint);
- fireTableRowsInserted(index, index);
- }
-
- public void addBreakpoint(Breakpoint breakpoint) {
- myBreakpoints.add(breakpoint);
- int row = myBreakpoints.size() - 1;
- fireTableRowsInserted(row, row);
- }
-
- public void removeRow(int idx) {
- if (idx >= 0 && idx < myBreakpoints.size()) {
- myBreakpoints.remove(idx);
- fireTableRowsDeleted(idx, idx);
- }
- }
-
- public int getRowCount() {
- return myBreakpoints.size();
- }
-
- public int getColumnCount() {
- return 2;
- }
-
- public String getColumnName(int column) {
- switch (column) {
- case ENABLED_STATE:
- return DebuggerBundle.message("breakpoint.table.header.column.enabled");
- case NAME:
- return DebuggerBundle.message("breakpoint.table.header.column.name");
- default :
- return "";
- }
- }
-
- public Object getValueAt(int rowIndex, int columnIndex) {
- Breakpoint breakpoint = myBreakpoints.get(rowIndex);
- if (columnIndex == NAME) {
- return breakpoint.getDisplayName();
- }
- if (columnIndex == ENABLED_STATE) {
- return breakpoint.ENABLED? Boolean.TRUE : Boolean.FALSE;
- }
- return null;
- }
-
- public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
- if (rowIndex < 0 || rowIndex >= myBreakpoints.size()) {
- return;
- }
- Breakpoint breakpoint = myBreakpoints.get(rowIndex);
-/*
- if (columnIndex == NAME) {
- breakpoint.setDisplayName((aValue != null)? aValue.toString() : "");
- }
- else
-*/
- if (columnIndex == ENABLED_STATE) {
- final boolean isEnabled = aValue == null || ((Boolean)aValue).booleanValue();
- final boolean valueChanged = isEnabled != breakpoint.ENABLED;
- breakpoint.ENABLED = isEnabled;
- if (valueChanged) {
- breakpoint.updateUI();
- }
- }
- fireTableRowsUpdated(rowIndex, rowIndex);
- }
-
- public Class getColumnClass(int columnIndex) {
- if (columnIndex == ENABLED_STATE) {
- return Boolean.class;
- }
- return super.getColumnClass(columnIndex);
- }
-
- public boolean isCellEditable(int rowIndex, int columnIndex) {
- if (columnIndex != ENABLED_STATE) {
- return false;
- }
- final boolean isSlave = myBreakpointManager.findMasterBreakpoint(myBreakpoints.get(rowIndex)) != null;
- return !isSlave;
- }
-}
diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointTree.java b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointTree.java
deleted file mode 100644
index 695fea471402..000000000000
--- a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointTree.java
+++ /dev/null
@@ -1,824 +0,0 @@
-/*
- * Copyright 2000-2009 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.intellij.debugger.ui.breakpoints;
-import com.intellij.debugger.DebuggerBundle;
-import com.intellij.debugger.DebuggerManagerEx;
-import com.intellij.openapi.project.Project;
-import com.intellij.ui.*;
-import com.intellij.util.ArrayUtil;
-import com.intellij.util.PlatformIcons;
-import com.intellij.util.containers.ContainerUtil;
-import com.intellij.util.containers.Convertor;
-import com.intellij.util.ui.tree.TreeUtil;
-import com.intellij.xdebugger.XDebuggerBundle;
-import org.jetbrains.annotations.NotNull;
-
-import javax.swing.*;
-import javax.swing.tree.DefaultTreeModel;
-import javax.swing.tree.TreePath;
-import java.util.*;
-
-/**
- * @author Eugene Zhuravlev
- * Date: May 20, 2005
- */
-public class BreakpointTree extends CheckboxTree {
- private static final String DEFAULT_PACKAGE_NAME = DebuggerBundle.message("default.package.name");
- private final CheckedTreeNode myRootNode;
- private final List<Breakpoint> myBreakpoints = new ArrayList<Breakpoint>();
- private final Map<TreeDescriptor, CheckedTreeNode> myDescriptorToNodeMap = new HashMap<TreeDescriptor, CheckedTreeNode>();
-
- private boolean myGroupByMethods = false;
- private boolean myGroupByClasses = true;
- private boolean myFlattenPackages = true;
-
- private final NodeAppender[] myAppenders = {
- new BreakpointToMethodAppender(),
- new BreakpointToClassAppender(),
- new BreakpointToPackageAppender(),
- new MethodToClassAppender(),
- new MethodToPackageAppender(),
- new ClassToPackageAppender(),
- new PackageToPackageAppender(),
- };
-
- private final Comparator<CheckedTreeNode> myNodeComparator = new Comparator<CheckedTreeNode>() {
- public int compare(CheckedTreeNode o1, CheckedTreeNode o2) {
- final int w1 = getWeight(o1);
- final int w2 = getWeight(o2);
- if (w1 != w2) {
- return w1 - w2;
- }
- final TreeDescriptor d1 = (TreeDescriptor)o1.getUserObject();
- final TreeDescriptor d2 = (TreeDescriptor)o2.getUserObject();
- if (d1 instanceof BreakpointDescriptor && d2 instanceof BreakpointDescriptor) {
- return 0;
- }
- return d1.getDisplayString().compareTo(d2.getDisplayString());
- }
-
- private int getWeight(CheckedTreeNode node) {
- if (node.getUserObject() instanceof BreakpointDescriptor) {
- return 100;
- }
- if (node.getUserObject() instanceof MethodDescriptor) {
- return 90;
- }
- if (node.getUserObject() instanceof PackageDescriptor) {
- return 80;
- }
- if (node.getUserObject() instanceof ClassDescriptor) {
- return 70;
- }
- return 50;
- }
- };
- private final BreakpointManager myBreakpointManager;
- private final BreakpointManagerListener myNodeUpdateListener;
-
- protected void installSpeedSearch() {
- new TreeSpeedSearch(this, new Convertor<TreePath, String>() {
- public String convert(TreePath path) {
- final CheckedTreeNode node = (CheckedTreeNode)path.getLastPathComponent();
- return ((TreeDescriptor)node.getUserObject()).getDisplayString();
- }
- });
- }
-
- public boolean getExpandsSelectedPaths() {
- return true;
- }
-
- public Breakpoint[] getSelectedBreakpoints() {
- final TreePath[] selectionPaths = getSelectionPaths();
- if (selectionPaths == null || selectionPaths.length == 0) {
- return Breakpoint.EMPTY_ARRAY;
- }
- final List<Breakpoint> breakpoints = new ArrayList<Breakpoint>(selectionPaths.length);
- for (TreePath path : selectionPaths) {
- final CheckedTreeNode node = (CheckedTreeNode)path.getLastPathComponent();
- TreeUtil.traverseDepth(node, new TreeUtil.Traverse() {
- public boolean accept(Object _node) {
- final CheckedTreeNode node = (CheckedTreeNode)_node;
- final TreeDescriptor descriptor = (TreeDescriptor)node.getUserObject();
- if (descriptor instanceof BreakpointDescriptor) {
- breakpoints.add(((BreakpointDescriptor)descriptor).getBreakpoint());
- }
- return true;
- }
- });
- }
- return breakpoints.toArray(new Breakpoint[breakpoints.size()]);
- }
-
- public void selectBreakpoint(Breakpoint breakpoint) {
- final CheckedTreeNode node = myDescriptorToNodeMap.get(new BreakpointDescriptor(breakpoint));
- if (node == null) {
- return;
- }
- TreeUtil.selectNode(this, node);
- }
-
- public void selectBreakpoints(Breakpoint[] breakpoints) {
- final List<CheckedTreeNode> nodes = new ArrayList<CheckedTreeNode>(breakpoints.length);
- for (Breakpoint breakpoint : breakpoints) {
- final CheckedTreeNode node = myDescriptorToNodeMap.get(new BreakpointDescriptor(breakpoint));
- if (node != null) {
- nodes.add(node);
- }
- }
- clearSelection();
- for (CheckedTreeNode node : nodes) {
- addSelectionPath(new TreePath(node.getPath()));
- }
- }
-
- public void selectFirstBreakpoint() {
- TreeUtil.traverseDepth(myRootNode, new TreeUtil.Traverse() {
- public boolean accept(Object node) {
- final CheckedTreeNode treeNode = (CheckedTreeNode)node;
- final TreeDescriptor descriptor = (TreeDescriptor)treeNode.getUserObject();
- if (descriptor instanceof BreakpointDescriptor) {
- TreeUtil.selectNode(BreakpointTree.this, treeNode);
- return false;
- }
- return true;
- }
- });
- }
-
- public List<Breakpoint> getBreakpoints() {
- return Collections.unmodifiableList(myBreakpoints);
- }
-
- public void dispose() {
- final KeyStroke[] treeStrokes = getRegisteredKeyStrokes();
- for (KeyStroke stroke : treeStrokes) {
- unregisterKeyboardAction(stroke);
- }
- myBreakpointManager.removeBreakpointManagerListener(myNodeUpdateListener);
- }
-
- private abstract static class TreeDescriptor {
- protected void customizeCellRenderer(final ColoredTreeCellRenderer targetRenderer, CheckedTreeNode node, boolean selected, final boolean checked, boolean expanded, boolean leaf, boolean hasFocus) {
- targetRenderer.setIcon(getDisplayIcon());
- targetRenderer.append(getDisplayString(), checked? SimpleTextAttributes.SIMPLE_CELL_ATTRIBUTES : SimpleTextAttributes.GRAYED_ATTRIBUTES);
- }
-
- protected abstract String getDisplayString();
-
- protected abstract Icon getDisplayIcon();
-
- }
-
- private final class BreakpointDescriptor extends TreeDescriptor {
- private final Breakpoint myBreakpoint;
- public BreakpointDescriptor(Breakpoint breakpoint) {
- myBreakpoint = breakpoint;
- }
- @NotNull
- public Breakpoint getBreakpoint() {
- return myBreakpoint;
- }
-
- protected Icon getDisplayIcon() {
- return myBreakpoint instanceof BreakpointWithHighlighter ?
- myBreakpoint.ENABLED? ((BreakpointWithHighlighter)myBreakpoint).getSetIcon(false) : ((BreakpointWithHighlighter)myBreakpoint).getDisabledIcon(false) : myBreakpoint.getIcon();
- }
-
- public String getDisplayString() {
- return myBreakpoint.getDisplayName();
- }
-
- public boolean equals(final Object o) {
- if (this == o) {
- return true;
- }
- if (o == null || getClass() != o.getClass()) {
- return false;
- }
- final BreakpointDescriptor breakpointDescriptor = (BreakpointDescriptor)o;
- return myBreakpoint.equals(breakpointDescriptor.myBreakpoint);
- }
-
- public int hashCode() {
- return myBreakpoint.hashCode();
- }
-
- public boolean isSlave() {
- final Breakpoint breakpoint = getBreakpoint();
- return myBreakpointManager.findMasterBreakpoint(breakpoint) != null;
- }
- }
-
- private static final class MethodDescriptor extends TreeDescriptor {
- @NotNull
- private final String myClassName;
- @NotNull
- private final String myMethodName;
- @NotNull
- private final String myPackageName;
-
- public MethodDescriptor(@NotNull String methodName, @NotNull String className, @NotNull String packageName) {
- myClassName = className;
- myMethodName = methodName.endsWith("()")? methodName : methodName + "()";
- myPackageName = packageName;
- }
-
- @NotNull
- public String getPackageName() {
- return myPackageName;
- }
-
- public String getClassName() {
- return myClassName;
- }
-
- public String getMethodName() {
- return myMethodName;
- }
-
- protected String getDisplayString() {
- return myMethodName;
- }
-
- protected Icon getDisplayIcon() {
- return PlatformIcons.METHOD_ICON;
- }
-
- public boolean equals(final Object o) {
- if (this == o) {
- return true;
- }
- if (o == null || getClass() != o.getClass()) {
- return false;
- }
- final MethodDescriptor methodDescriptor = (MethodDescriptor)o;
- if (!myClassName.equals(methodDescriptor.myClassName)) {
- return false;
- }
- return myMethodName.equals(methodDescriptor.myMethodName);
- }
-
- public int hashCode() {
- int result = myClassName.hashCode();
- result = 29 * result + myMethodName.hashCode();
- return result;
- }
- }
-
- private static final class ClassDescriptor extends TreeDescriptor {
- @NotNull private final String myClassName;
- @NotNull private final String myPackageName;
-
- public ClassDescriptor(@NotNull String className, @NotNull String packageName) {
- myClassName = className;
- myPackageName = packageName.length() == 0? DEFAULT_PACKAGE_NAME : packageName;
- }
-
- @NotNull
- public String getPackageName() {
- return myPackageName;
- }
-
- @NotNull
- public String getClassName() {
- return myClassName;
- }
-
- protected String getDisplayString() {
- return getClassName();
- }
-
- protected Icon getDisplayIcon() {
- return PlatformIcons.CLASS_ICON;
- }
-
- public boolean equals(final Object o) {
- if (this == o) {
- return true;
- }
- if (o == null || getClass() != o.getClass()) {
- return false;
- }
-
- final ClassDescriptor classDescriptor = (ClassDescriptor)o;
-
- return myClassName.equals(classDescriptor.myClassName);
-
- }
-
- public int hashCode() {
- return myClassName.hashCode();
- }
- }
-
- private static final class PackageDescriptor extends TreeDescriptor {
- private final String myPackageName;
-
- public PackageDescriptor(String packageName) {
- myPackageName = "".equals(packageName)? DEFAULT_PACKAGE_NAME : packageName;
- }
-
- public String getPackageName() {
- return myPackageName;
- }
-
- public String getParentPackageName() {
- final int dotIndex = myPackageName.lastIndexOf('.');
- return dotIndex >= 0 ? myPackageName.substring(0, dotIndex) : null;
- }
-
- public void customizeCellRenderer(final ColoredTreeCellRenderer targetRenderer, CheckedTreeNode node, boolean selected,
- final boolean checked, boolean expanded, boolean leaf, boolean hasFocus) {
- targetRenderer.setIcon(PlatformIcons.PACKAGE_ICON);
- final String displayName;
- final CheckedTreeNode parent = (CheckedTreeNode)node.getParent();
- if (parent != null && parent.getUserObject() instanceof PackageDescriptor) {
- final String parentPackageInTree = ((PackageDescriptor)parent.getUserObject()).getPackageName() + ".";
- displayName = myPackageName.startsWith(parentPackageInTree)? myPackageName.substring(parentPackageInTree.length()) : myPackageName;
- }
- else {
- displayName = myPackageName;
- }
- targetRenderer.append(displayName, checked? SimpleTextAttributes.SIMPLE_CELL_ATTRIBUTES : SimpleTextAttributes.GRAYED_ATTRIBUTES);
- }
-
- protected String getDisplayString() {
- return myPackageName;
- }
-
- protected Icon getDisplayIcon() {
- return PlatformIcons.PACKAGE_ICON;
- }
-
- public boolean equals(final Object o) {
- if (this == o) {
- return true;
- }
- if (o == null || getClass() != o.getClass()) {
- return false;
- }
-
- final PackageDescriptor packageDescriptor = (PackageDescriptor)o;
-
- return myPackageName.equals(packageDescriptor.myPackageName);
-
- }
-
- public int hashCode() {
- return myPackageName.hashCode();
- }
- }
-
- public BreakpointTree(final Project project) {
- super(new BreakpointTreeCellRenderer(), new CheckedTreeNode(new RootDescriptor()));
- myRootNode = (CheckedTreeNode)getModel().getRoot();
- myDescriptorToNodeMap.put((TreeDescriptor)myRootNode.getUserObject(), myRootNode);
- myBreakpointManager = DebuggerManagerEx.getInstanceEx(project).getBreakpointManager();
- myNodeUpdateListener = new BreakpointManagerListener() {
- public void breakpointsChanged() {
- repaint();
- }
- };
- myBreakpointManager.addBreakpointManagerListener(myNodeUpdateListener);
- getEmptyText().setText(XDebuggerBundle.message("debugger.no.breakpoints"));
- }
-
- public boolean isGroupByMethods() {
- return myGroupByMethods;
- }
-
- public void setGroupByMethods(boolean groupByMethods) {
- if (myGroupByMethods != groupByMethods) {
- myGroupByMethods = groupByMethods;
- rebuildTree();
- }
- }
-
- public boolean isGroupByClasses() {
- return myGroupByClasses;
- }
-
- public void setGroupByClasses(boolean groupByClasses) {
- if (myGroupByClasses != groupByClasses) {
- myGroupByClasses = groupByClasses;
- rebuildTree();
- }
- }
-
- public boolean isFlattenPackages() {
- return myFlattenPackages;
- }
-
- public void setFlattenPackages(boolean flattenPackages) {
- if (myFlattenPackages != flattenPackages) {
- myFlattenPackages = flattenPackages;
- rebuildTree();
- }
- }
-
- @Override
- protected void onNodeStateChanged(final CheckedTreeNode node) {
- final Object descriptor = node.getUserObject();
- final Breakpoint breakpoint;
- if (descriptor instanceof BreakpointDescriptor) {
- breakpoint = ((BreakpointDescriptor)descriptor).getBreakpoint();
- if (myBreakpointManager.findMasterBreakpoint(breakpoint) != null) {
- return;
- }
- }
- else {
- breakpoint = null;
- }
-
- if (breakpoint != null) {
- myBreakpointManager.setBreakpointEnabled(breakpoint, node.isChecked());
- }
-
- }
-
- public void addBreakpoint(final Breakpoint breakpoint) {
- myBreakpoints.add(breakpoint);
- breakpoint.updateUI(new Runnable() {
- public void run() {
- rebuildTree();
- }
- });
- rebuildTree();
- selectBreakpoint(breakpoint);
- }
-
- public void removeBreakpoint(Breakpoint breakpoint) {
- myBreakpoints.remove(breakpoint);
- rebuildTree();
- }
-
- public void removeBreakpoints(Breakpoint[] breakpoints) {
- myBreakpoints.removeAll(Arrays.asList(breakpoints));
- rebuildTree();
- }
-
- public void setBreakpoints(Breakpoint[] breakpoints) {
- myBreakpoints.clear();
- ContainerUtil.addAll(myBreakpoints, breakpoints);
- rebuildTree();
- }
-
- public Breakpoint getPreviousSibling(Breakpoint breakpoint) {
- return getSibling(breakpoint, false);
- }
-
-
- public Breakpoint getNextSibling(Breakpoint breakpoint) {
- return getSibling(breakpoint, true);
- }
-
- private Breakpoint getSibling(Breakpoint breakpoint, boolean nextSibling) {
- final CheckedTreeNode node = myDescriptorToNodeMap.get(new BreakpointDescriptor(breakpoint));
- if (node == null) {
- return null;
- }
- final CheckedTreeNode sibling = (CheckedTreeNode) (nextSibling? node.getNextSibling() : node.getPreviousSibling());
- if (sibling == null) {
- return null;
- }
- final TreeDescriptor descriptor = (TreeDescriptor)sibling.getUserObject();
- return descriptor instanceof BreakpointDescriptor ? ((BreakpointDescriptor)descriptor).getBreakpoint() : null;
- }
-
- private void rebuildTree() {
- final TreeStateSnapshot treeStateSnapshot = new TreeStateSnapshot(this);
- myRootNode.removeAllChildren();
- myDescriptorToNodeMap.clear();
- myDescriptorToNodeMap.put((TreeDescriptor)myRootNode.getUserObject(), myRootNode);
- // build tree
- for (final Breakpoint breakpoint : myBreakpoints) {
- CheckedTreeNode node = createNode(new BreakpointDescriptor(breakpoint));
- node.setChecked(breakpoint.ENABLED);
- addNode(node);
- }
- // remove all package nodes with one child
- final int count = myRootNode.getChildCount();
- final List<CheckedTreeNode> children = new ArrayList<CheckedTreeNode>();
- for (int idx = 0; idx < count; idx++) {
- CheckedTreeNode child = (CheckedTreeNode)myRootNode.getChildAt(idx);
- if (!(child.getUserObject() instanceof PackageDescriptor)) {
- children.add(child);
- continue;
- }
- while (child.getUserObject() instanceof PackageDescriptor && child.getChildCount() <= 1) {
- child = (CheckedTreeNode)child.getChildAt(0);
- }
- if (!(child.getUserObject() instanceof PackageDescriptor)) {
- child = (CheckedTreeNode)child.getParent();
- }
- for (CheckedTreeNode childToRemove = (CheckedTreeNode)child.getParent(); !childToRemove.equals(myRootNode); childToRemove = (CheckedTreeNode)childToRemove.getParent()) {
- myDescriptorToNodeMap.remove(childToRemove.getUserObject());
- }
- children.add(child);
- }
- for (final CheckedTreeNode aChildren : children) {
- aChildren.removeFromParent();
- }
- myRootNode.removeAllChildren();
- for (final CheckedTreeNode child : children) {
- myRootNode.add(child);
- }
- sortChildren(myRootNode);
- ((DefaultTreeModel)getModel()).nodeStructureChanged(myRootNode);
- treeStateSnapshot.restore(this);
- expandPath(new TreePath(myRootNode));
- }
-
- private void sortChildren(CheckedTreeNode node) {
- final int childCount = node.getChildCount();
- if (childCount == 0) {
- return;
- }
- final List<CheckedTreeNode> children = new ArrayList<CheckedTreeNode>(childCount);
- for (int idx = 0; idx < childCount; idx++) {
- children.add((CheckedTreeNode)node.getChildAt(idx));
- }
- for (CheckedTreeNode child : children) {
- sortChildren(child);
- child.removeFromParent();
- }
- Collections.sort(children, myNodeComparator);
- for (CheckedTreeNode child : children) {
- node.add(child);
- }
- }
-
- @NotNull
- private CheckedTreeNode createNode(final TreeDescriptor descriptor) {
- final CheckedTreeNode node = new CheckedTreeNode(descriptor);
- myDescriptorToNodeMap.put(descriptor, node);
- return node;
- }
-
- /**
- * @param node
- */
- private void addNode(CheckedTreeNode node) {
- for (final NodeAppender appender : myAppenders) {
- node = appender.append(node);
- if (node == null) {
- break;
- }
- }
- if (node != null) {
- attachNodeToParent(getDescriptor(myRootNode), node);
- }
- }
-
- private static TreeDescriptor getDescriptor(final CheckedTreeNode node) {
- return (TreeDescriptor)node.getUserObject();
- }
-
- /**
- * @param parentDescriptor a descriptor of the childNode (possibly not existing) to attach to
- * @param childNode the childNode to be attached
- * @return either parent node if it has just been created or null, if the node has been attached to already existing childNode
- */
- private CheckedTreeNode attachNodeToParent(final TreeDescriptor parentDescriptor, final CheckedTreeNode childNode) {
- CheckedTreeNode parentNode = myDescriptorToNodeMap.get(parentDescriptor);
- try {
- if (parentNode != null) {
- parentNode.add(childNode);
- return null; // added to already existing, so stop iteration over appenders
- }
- parentNode = createNode(parentDescriptor);
- parentNode.add(childNode);
- return parentNode;
- }
- finally {
- if (parentNode != null && parentNode.getChildCount() == 1) {
- expandPath(new TreePath(parentNode.getPath()));
- }
- }
- }
-
- private static class BreakpointTreeCellRenderer extends CheckboxTreeCellRenderer {
- public void customizeRenderer(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
- if (value instanceof CheckedTreeNode) {
- final CheckedTreeNode node = (CheckedTreeNode)value;
- final TreeDescriptor descriptor = getDescriptor(node);
- descriptor.customizeCellRenderer(getTextRenderer(), node, selected, node.isChecked(), expanded, leaf, hasFocus);
- if (descriptor instanceof BreakpointDescriptor) {
- myCheckbox.setEnabled(node.isEnabled() && !((BreakpointDescriptor)descriptor).isSlave());
- }
- }
- }
- }
-
- private abstract static class NodeAppender {
- public abstract CheckedTreeNode append(CheckedTreeNode node);
- }
-
- private class BreakpointToMethodAppender extends NodeAppender {
- public CheckedTreeNode append(CheckedTreeNode node) {
- if (!myGroupByMethods) {
- return node;
- }
- final TreeDescriptor descriptor = getDescriptor(node);
- if (!(descriptor instanceof BreakpointDescriptor)) {
- return node;
- }
- final Breakpoint breakpoint = ((BreakpointDescriptor)descriptor).getBreakpoint();
- if (!(breakpoint instanceof LineBreakpoint)) {
- return node;
- }
- final LineBreakpoint lineBreakpoint = (LineBreakpoint)breakpoint;
- final String methodName = lineBreakpoint.getMethodName();
- final String className = lineBreakpoint.getShortClassName();
- final String packageName = lineBreakpoint.getPackageName();
- if (methodName == null || className == null || packageName == null) {
- return node;
- }
- return attachNodeToParent(new MethodDescriptor(methodName, className, packageName), node);
- }
- }
-
- private class BreakpointToClassAppender extends NodeAppender {
- public CheckedTreeNode append(CheckedTreeNode node) {
- if (!myGroupByClasses) {
- return node;
- }
- final TreeDescriptor descriptor = getDescriptor(node);
- if (!(descriptor instanceof BreakpointDescriptor)) {
- return node;
- }
-
- final Breakpoint breakpoint = ((BreakpointDescriptor)descriptor).getBreakpoint();
- final String className = breakpoint.getShortClassName();
- if (className == null) {
- return node;
- }
- final String packageName = breakpoint.getPackageName();
- if (packageName == null) {
- return node;
- }
- return attachNodeToParent(new ClassDescriptor(className, packageName), node);
- }
- }
-
- private class BreakpointToPackageAppender extends NodeAppender {
- public CheckedTreeNode append(CheckedTreeNode node) {
- final TreeDescriptor descriptor = getDescriptor(node);
- if (!(descriptor instanceof BreakpointDescriptor)) {
- return node;
- }
-
- final Breakpoint breakpoint = ((BreakpointDescriptor)descriptor).getBreakpoint();
- final String packageName;
- if (breakpoint instanceof ExceptionBreakpoint) {
- packageName = breakpoint.getPackageName();
- }
- else if (breakpoint instanceof BreakpointWithHighlighter) {
- packageName = breakpoint.getPackageName();
- }
- else {
- packageName = null;
- }
- if (packageName == null) {
- return node;
- }
- return attachNodeToParent(new PackageDescriptor(packageName), node);
- }
- }
-
- private class MethodToClassAppender extends NodeAppender {
- public CheckedTreeNode append(CheckedTreeNode node) {
- if (!myGroupByClasses) {
- return node;
- }
- final TreeDescriptor descriptor = getDescriptor(node);
- if (!(descriptor instanceof MethodDescriptor)) {
- return node;
- }
- final MethodDescriptor methodDescriptor = (MethodDescriptor)descriptor;
- final String className = methodDescriptor.getClassName();
- final String packageName = methodDescriptor.getPackageName();
- return attachNodeToParent(new ClassDescriptor(className, packageName), node);
- }
- }
-
- private class MethodToPackageAppender extends NodeAppender {
- public CheckedTreeNode append(CheckedTreeNode node) {
- final TreeDescriptor descriptor = getDescriptor(node);
- if (!(descriptor instanceof MethodDescriptor)) {
- return node;
- }
- final MethodDescriptor methodDescriptor = (MethodDescriptor)descriptor;
- final String packageName = methodDescriptor.getPackageName();
- return attachNodeToParent(new PackageDescriptor(packageName), node);
- }
- }
-
- private class ClassToPackageAppender extends NodeAppender {
- public CheckedTreeNode append(CheckedTreeNode node) {
- final TreeDescriptor descriptor = getDescriptor(node);
- if (!(descriptor instanceof ClassDescriptor)) {
- return node;
- }
-
- final String packageName = ((ClassDescriptor)descriptor).getPackageName();
- return attachNodeToParent(new PackageDescriptor(packageName), node);
- }
- }
-
- private class PackageToPackageAppender extends NodeAppender {
- public CheckedTreeNode append(CheckedTreeNode node) {
- if (myFlattenPackages) {
- return node;
- }
- final TreeDescriptor descriptor = getDescriptor(node);
- if (!(descriptor instanceof PackageDescriptor)) {
- return node;
- }
-
- final PackageDescriptor packageDescriptor = (PackageDescriptor)descriptor;
- final String parentPackageName = packageDescriptor.getParentPackageName();
- if (parentPackageName == null) {
- return node;
- }
- final CheckedTreeNode parentNode = attachNodeToParent(new PackageDescriptor(parentPackageName), node);
- if (parentNode == null) {
- return null;
- }
- return append(parentNode);
- }
- }
-
- private static class RootDescriptor extends TreeDescriptor {
-
- protected String getDisplayString() {
- return "";
- }
-
- protected Icon getDisplayIcon() {
- return PlatformIcons.PROJECT_ICON;
- }
- }
-
- private static class TreeStateSnapshot {
- private final Object[] myExpandedUserObjects;
- private final Object[] mySelectedUserObjects;
-
- public TreeStateSnapshot(BreakpointTree tree) {
- final List<TreePath> expandedPaths = TreeUtil.collectExpandedPaths(tree);
- myExpandedUserObjects = getUserObjects(expandedPaths.toArray(new TreePath[expandedPaths.size()]));
- mySelectedUserObjects =getUserObjects(tree.getSelectionPaths());
- }
-
- private static Object[] getUserObjects(final TreePath[] treePaths) {
- if (treePaths == null) {
- return ArrayUtil.EMPTY_OBJECT_ARRAY;
- }
- Object[] userObjects = new Object[treePaths.length];
- int index = 0;
- for (TreePath path : treePaths) {
- userObjects[index++] = ((CheckedTreeNode)path.getLastPathComponent()).getUserObject();
- }
- return userObjects;
- }
-
- public void restore(BreakpointTree tree) {
- final List<TreePath> pathsToExpand = getPaths(tree, myExpandedUserObjects);
- if (!pathsToExpand.isEmpty()) {
- TreeUtil.restoreExpandedPaths(tree, pathsToExpand);
- }
-
- final List<TreePath> pathsToSelect = getPaths(tree, mySelectedUserObjects);
- if (!pathsToSelect.isEmpty()) {
- tree.getSelectionModel().clearSelection();
- tree.setSelectionPaths(pathsToSelect.toArray(new TreePath[pathsToSelect.size()]));
- }
- }
-
- private static List<TreePath> getPaths(BreakpointTree tree, final Object[] userObjects) {
- final List<TreePath> paths = new ArrayList<TreePath>(userObjects.length);
- for (Object descriptor : userObjects) {
- final CheckedTreeNode node = tree.myDescriptorToNodeMap.get(descriptor);
- if (node != null) {
- paths.add(new TreePath(node.getPath()));
- }
- }
- return paths;
- }
- }
-}
diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/DebuggerTreeRenderer.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/DebuggerTreeRenderer.java
index 857443f456c9..fe6941850a15 100644
--- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/DebuggerTreeRenderer.java
+++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/DebuggerTreeRenderer.java
@@ -23,12 +23,14 @@ import com.intellij.debugger.ui.tree.ValueDescriptor;
import com.intellij.icons.AllIcons;
import com.intellij.ide.highlighter.JavaHighlightingColors;
import com.intellij.openapi.editor.colors.EditorColorsManager;
+import com.intellij.openapi.editor.colors.EditorColorsScheme;
import com.intellij.openapi.editor.markup.TextAttributes;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.ui.*;
import com.intellij.util.PlatformIcons;
import com.intellij.xdebugger.impl.ui.XDebuggerUIConstants;
import com.intellij.xdebugger.impl.ui.tree.ValueMarkup;
+import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
@@ -112,15 +114,37 @@ public class DebuggerTreeRenderer extends ColoredTreeCellRenderer {
return nodeIcon;
}
+ @NotNull
+ public static EditorColorsScheme getColorScheme(@Nullable JComponent component) {
+ EditorColorsScheme globalScheme = EditorColorsManager.getInstance().getGlobalScheme();
+ if (component != null && ColorUtil.isDark(component.getBackground()) != ColorUtil.isDark(globalScheme.getDefaultBackground())) {
+ EditorColorsScheme scheme = EditorColorsManager.getInstance().getScheme(EditorColorsScheme.DEFAULT_SCHEME_NAME);
+ if (scheme != null) {
+ return scheme;
+ }
+ }
+ return globalScheme;
+ }
+
+ public static SimpleColoredText getDescriptorText(DebuggerContextImpl debuggerContext,
+ NodeDescriptorImpl descriptor,
+ EditorColorsScheme colorsScheme,
+ boolean multiline) {
+ return getDescriptorText(debuggerContext, descriptor, colorsScheme, multiline, true);
+ }
+
public static SimpleColoredText getDescriptorText(final DebuggerContextImpl debuggerContext, NodeDescriptorImpl descriptor, boolean multiline) {
- return getDescriptorText(debuggerContext, descriptor, multiline, true);
+ return getDescriptorText(debuggerContext, descriptor, getColorScheme(null), multiline, true);
}
public static SimpleColoredText getDescriptorTitle(final DebuggerContextImpl debuggerContext, NodeDescriptorImpl descriptor) {
- return getDescriptorText(debuggerContext, descriptor, false, false);
+ return getDescriptorText(debuggerContext, descriptor, getColorScheme(null), false, false);
}
- private static SimpleColoredText getDescriptorText(final DebuggerContextImpl debuggerContext, final NodeDescriptorImpl descriptor, boolean multiline,
+ private static SimpleColoredText getDescriptorText(DebuggerContextImpl debuggerContext,
+ NodeDescriptorImpl descriptor,
+ EditorColorsScheme colorScheme,
+ boolean multiline,
boolean appendValue) {
SimpleColoredText descriptorText = new SimpleColoredText();
@@ -195,10 +219,10 @@ public class DebuggerTreeRenderer extends ColoredTreeCellRenderer {
else {
TextAttributes attributes = null;
if (valueDescriptor.isNull()){
- attributes = EditorColorsManager.getInstance().getGlobalScheme().getAttributes(JavaHighlightingColors.KEYWORD);
+ attributes = colorScheme.getAttributes(JavaHighlightingColors.KEYWORD);
}
else if (valueDescriptor.isString()) {
- attributes = EditorColorsManager.getInstance().getGlobalScheme().getAttributes(JavaHighlightingColors.STRING);
+ attributes = colorScheme.getAttributes(JavaHighlightingColors.STRING);
}
valueLabelAttribs = attributes != null? SimpleTextAttributes.fromTextAttributes(attributes) : DEFAULT_ATTRIBUTES;
}
@@ -207,11 +231,11 @@ public class DebuggerTreeRenderer extends ColoredTreeCellRenderer {
if(exception != null) {
final String errorMessage = exception.getMessage();
if(valueLabel.endsWith(errorMessage)) {
- appendValueTextWithEscapesRendering(descriptorText, valueLabel.substring(0, valueLabel.length() - errorMessage.length()), valueLabelAttribs);
+ appendValueTextWithEscapesRendering(descriptorText, valueLabel.substring(0, valueLabel.length() - errorMessage.length()), valueLabelAttribs, colorScheme);
descriptorText.append(errorMessage, XDebuggerUIConstants.EXCEPTION_ATTRIBUTES);
}
else {
- appendValueTextWithEscapesRendering(descriptorText, valueLabel, valueLabelAttribs);
+ appendValueTextWithEscapesRendering(descriptorText, valueLabel, valueLabelAttribs, colorScheme);
descriptorText.append(errorMessage, XDebuggerUIConstants.EXCEPTION_ATTRIBUTES);
}
}
@@ -220,7 +244,7 @@ public class DebuggerTreeRenderer extends ColoredTreeCellRenderer {
descriptorText.append(XDebuggerUIConstants.COLLECTING_DATA_MESSAGE, XDebuggerUIConstants.COLLECTING_DATA_HIGHLIGHT_ATTRIBUTES);
}
else {
- appendValueTextWithEscapesRendering(descriptorText, valueLabel, valueLabelAttribs);
+ appendValueTextWithEscapesRendering(descriptorText, valueLabel, valueLabelAttribs, colorScheme);
}
}
}
@@ -233,7 +257,10 @@ public class DebuggerTreeRenderer extends ColoredTreeCellRenderer {
return descriptorText;
}
- private static void appendValueTextWithEscapesRendering(SimpleColoredText descriptorText, String valueText, final SimpleTextAttributes attribs) {
+ private static void appendValueTextWithEscapesRendering(SimpleColoredText descriptorText,
+ String valueText,
+ SimpleTextAttributes attribs,
+ EditorColorsScheme colorScheme) {
SimpleTextAttributes escapeAttribs = null;
final StringBuilder buf = new StringBuilder();
boolean slashFound = false;
@@ -248,7 +275,7 @@ public class DebuggerTreeRenderer extends ColoredTreeCellRenderer {
}
if (escapeAttribs == null) { // lazy init
- TextAttributes fromHighlighter = EditorColorsManager.getInstance().getGlobalScheme().getAttributes(JavaHighlightingColors.VALID_STRING_ESCAPE);
+ TextAttributes fromHighlighter = colorScheme.getAttributes(JavaHighlightingColors.VALID_STRING_ESCAPE);
if (fromHighlighter != null) {
escapeAttribs = SimpleTextAttributes.fromTextAttributes(fromHighlighter);
}
diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/ArgumentValueDescriptorImpl.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/ArgumentValueDescriptorImpl.java
index 3cb94d43e15c..7adee9d7c0eb 100644
--- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/ArgumentValueDescriptorImpl.java
+++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/ArgumentValueDescriptorImpl.java
@@ -30,6 +30,8 @@ import com.intellij.util.IncorrectOperationException;
import com.sun.jdi.PrimitiveValue;
import com.sun.jdi.Value;
+import java.util.HashSet;
+import java.util.Set;
import java.util.Stack;
public class ArgumentValueDescriptorImpl extends ValueDescriptorImpl{
@@ -110,6 +112,7 @@ public class ArgumentValueDescriptorImpl extends ValueDescriptorImpl{
private class LocalVariableNameFinder extends JavaRecursiveElementVisitor {
private final int myStartSlot;
private final StringBuilder myNameBuilder;
+ private final Set<String> myVisitedNames = new HashSet<String>();
private int myCurrentSlotIndex;
private final Stack<Integer> myIndexStack;
@@ -122,14 +125,24 @@ public class ArgumentValueDescriptorImpl extends ValueDescriptorImpl{
@Override
public void visitLocalVariable(PsiLocalVariable variable) {
- if (myCurrentSlotIndex == myIndex) {
+ appendName(variable.getName());
+ final PsiType varType = variable.getType();
+ myCurrentSlotIndex += (varType == PsiType.DOUBLE || varType == PsiType.LONG)? 2 : 1;
+ }
+
+ public void visitSynchronizedStatement(PsiSynchronizedStatement statement) {
+ appendName("<monitor>");
+ myCurrentSlotIndex++;
+ super.visitSynchronizedStatement(statement);
+ }
+
+ private void appendName(String varName) {
+ if (myCurrentSlotIndex == myIndex && myVisitedNames.add(varName)) {
if (myNameBuilder.length() != 0) {
myNameBuilder.append(" | ");
}
- myNameBuilder.append(variable.getName());
+ myNameBuilder.append(varName);
}
- final PsiType varType = variable.getType();
- myCurrentSlotIndex += (varType == PsiType.DOUBLE || varType == PsiType.LONG)? 2 : 1;
}
@Override
diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/DebuggerTreeNodeImpl.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/DebuggerTreeNodeImpl.java
index 665a6a1ad25d..b6877dc6acc3 100644
--- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/DebuggerTreeNodeImpl.java
+++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/DebuggerTreeNodeImpl.java
@@ -87,7 +87,7 @@ public class DebuggerTreeNodeImpl extends TreeBuilderNode implements DebuggerTre
final NodeDescriptorImpl descriptor = getDescriptor();
myIcon = DebuggerTreeRenderer.getDescriptorIcon(descriptor);
final DebuggerContextImpl context = getTree().getDebuggerContext();
- myText = DebuggerTreeRenderer.getDescriptorText(context, descriptor, false);
+ myText = DebuggerTreeRenderer.getDescriptorText(context, descriptor, DebuggerTreeRenderer.getColorScheme(myTree), false);
if (descriptor instanceof ValueDescriptor) {
final ValueMarkup markup = ((ValueDescriptor)descriptor).getMarkup(context.getDebugProcess());
myMarkupTooltipText = markup != null? markup.getToolTipText() : null;
diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/FieldDescriptorImpl.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/FieldDescriptorImpl.java
index 521c2236639f..586dadfe5068 100644
--- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/FieldDescriptorImpl.java
+++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/FieldDescriptorImpl.java
@@ -18,12 +18,14 @@ package com.intellij.debugger.ui.impl.watch;
import com.intellij.debugger.DebuggerBundle;
import com.intellij.debugger.DebuggerContext;
import com.intellij.debugger.SourcePosition;
+import com.intellij.debugger.engine.DebugProcessImpl;
import com.intellij.debugger.engine.DebuggerManagerThreadImpl;
import com.intellij.debugger.engine.DebuggerUtils;
import com.intellij.debugger.engine.JVMNameUtil;
import com.intellij.debugger.engine.evaluation.EvaluateException;
import com.intellij.debugger.engine.evaluation.EvaluateExceptionUtil;
import com.intellij.debugger.engine.evaluation.EvaluationContextImpl;
+import com.intellij.debugger.engine.events.DebuggerContextCommandImpl;
import com.intellij.debugger.impl.DebuggerContextImpl;
import com.intellij.debugger.impl.DebuggerSession;
import com.intellij.debugger.impl.PositionUtil;
@@ -32,6 +34,8 @@ import com.intellij.debugger.ui.tree.FieldDescriptor;
import com.intellij.debugger.ui.tree.NodeDescriptor;
import com.intellij.debugger.ui.tree.render.ClassRenderer;
import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.Computable;
+import com.intellij.openapi.util.Ref;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.search.GlobalSearchScope;
@@ -98,20 +102,43 @@ public class FieldDescriptorImpl extends ValueDescriptorImpl implements FieldDes
PsiClass aClass = facade.findClass(type.name().replace('$', '.'), scope);
if (aClass == null) {
// trying to search, assuming declaring class is an anonymous class
- try {
- final List<Location> locations = type.allLineLocations();
- if (!locations.isEmpty()) {
- // important: use the last location to be sure the position will be within the anonymous class
- final Location lastLocation = locations.get(locations.size() - 1);
- final SourcePosition position = context.getDebugProcess().getPositionManager().getSourcePosition(lastLocation);
- if (position != null) {
- aClass = JVMNameUtil.getClassAt(position);
+ final DebugProcessImpl debugProcess = context.getDebugProcess();
+ if (debugProcess != null) {
+ final Computable<PsiClass> classComputable = new Computable<PsiClass>() {
+ public PsiClass compute() {
+ try {
+ final List<Location> locations = type.allLineLocations();
+ if (!locations.isEmpty()) {
+ // important: use the last location to be sure the position will be within the anonymous class
+ final Location lastLocation = locations.get(locations.size() - 1);
+ final SourcePosition position = debugProcess.getPositionManager().getSourcePosition(lastLocation);
+ if (position != null) {
+ return JVMNameUtil.getClassAt(position);
+ }
+ }
+ }
+ catch (AbsentInformationException ignored) {
+ }
+ catch (ClassNotPreparedException ignored) {
+ }
+ return null;
}
+ };
+ if (!DebuggerManagerThreadImpl.isManagerThread()) {
+ final Ref<PsiClass> classRef = new Ref<PsiClass>(null);
+ debugProcess.getManagerThread().invokeAndWait(new DebuggerContextCommandImpl(context) {
+ public Priority getPriority() {
+ return Priority.HIGH;
+ }
+ public void threadAction() {
+ classRef.set(classComputable.compute());
+ }
+ });
+ aClass = classRef.get();
+ }
+ else {
+ aClass = classComputable.compute();
}
- }
- catch (AbsentInformationException ignored) {
- }
- catch (ClassNotPreparedException ignored) {
}
}
diff --git a/java/idea-ui/src/com/intellij/facet/impl/ui/libraries/LibraryOptionsPanel.java b/java/idea-ui/src/com/intellij/facet/impl/ui/libraries/LibraryOptionsPanel.java
index 3eb6b0ab6cb9..0d06c9fb1632 100644
--- a/java/idea-ui/src/com/intellij/facet/impl/ui/libraries/LibraryOptionsPanel.java
+++ b/java/idea-ui/src/com/intellij/facet/impl/ui/libraries/LibraryOptionsPanel.java
@@ -125,10 +125,7 @@ public class LibraryOptionsPanel implements Disposable {
public void run() {
if (!myDisposed) {
showSettingsPanel(libraryDescription, baseDirectoryPath, versionFilter, showDoNotCreateOption, versions);
- LibraryDownloadSettings settings = mySettings.getDownloadSettings();
- if (settings != null) {
- onVersionChanged(settings.getVersion());
- }
+ onVersionChanged(getPresentableVersion());
}
}
});
@@ -141,7 +138,28 @@ public class LibraryOptionsPanel implements Disposable {
}
}
- protected void onVersionChanged(FrameworkLibraryVersion version) {
+ @Nullable
+ private String getPresentableVersion() {
+ switch (myButtonEnumModel.getSelected()) {
+ case DOWNLOAD:
+ LibraryDownloadSettings settings = mySettings.getDownloadSettings();
+ if (settings != null) {
+ return settings.getVersion().getVersionNumber();
+ }
+ break;
+ case USE_LIBRARY:
+ LibraryEditor item = myLibraryComboBoxModel.getSelectedItem();
+ if (item instanceof ExistingLibraryEditor) {
+ return item.getName();
+ }
+ break;
+ default:
+ return null;
+ }
+ return null;
+ }
+
+ protected void onVersionChanged(@Nullable String version) {
}
public JPanel getSimplePanel() {
@@ -176,6 +194,7 @@ public class LibraryOptionsPanel implements Disposable {
@Override
public void actionPerformed(ActionEvent e) {
updateState();
+ onVersionChanged(getPresentableVersion());
}
});
@@ -208,6 +227,7 @@ public class LibraryOptionsPanel implements Disposable {
myButtonEnumModel.setSelected(Choice.USE_LIBRARY);
}
updateState();
+ onVersionChanged(getPresentableVersion());
}
});
myExistingLibraryComboBox.setRenderer(new ColoredListCellRenderer() {
@@ -346,7 +366,7 @@ public class LibraryOptionsPanel implements Disposable {
}
private void doCreate() {
- final NewLibraryConfiguration libraryConfiguration = myLibraryDescription.createNewLibrary(myPanel, getBaseDirectory());
+ final NewLibraryConfiguration libraryConfiguration = myLibraryDescription.createNewLibrary(myCreateButton, getBaseDirectory());
if (libraryConfiguration != null) {
final NewLibraryEditor libraryEditor = new NewLibraryEditor(libraryConfiguration.getLibraryType(), libraryConfiguration.getProperties());
libraryEditor.setName(myLibrariesContainer.suggestUniqueLibraryName(libraryConfiguration.getDefaultLibraryName()));
diff --git a/java/idea-ui/src/com/intellij/ide/projectWizard/NewProjectWizard.java b/java/idea-ui/src/com/intellij/ide/projectWizard/NewProjectWizard.java
index 290d3cd65f8f..77d6d91b9f3b 100644
--- a/java/idea-ui/src/com/intellij/ide/projectWizard/NewProjectWizard.java
+++ b/java/idea-ui/src/com/intellij/ide/projectWizard/NewProjectWizard.java
@@ -33,8 +33,6 @@ public class NewProjectWizard extends AbstractProjectWizard {
public NewProjectWizard(@Nullable Project project, @NotNull ModulesProvider modulesProvider, @Nullable String defaultPath) {
super("New Project", project, defaultPath);
-// addStep();
-// addStep(new ProjectSummaryStep(myWizardContext));
myWizardContext.setNewWizard(true);
mySequence = new StepSequence();
mySequence.addCommonStep(new ProjectTypeStep(myWizardContext, this, modulesProvider));
diff --git a/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectCategory.java b/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectCategory.java
index 0862c7379724..7ef2e82feab3 100644
--- a/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectCategory.java
+++ b/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectCategory.java
@@ -69,6 +69,10 @@ public abstract class ProjectCategory {
return ArrayUtil.EMPTY_STRING_ARRAY;
}
+ public String[] getPreselectedFrameworkIds() {
+ return ArrayUtil.EMPTY_STRING_ARRAY;
+ }
+
@Override
public String toString() {
return getDisplayName();
diff --git a/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectSummaryStep.form b/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectSummaryStep.form
deleted file mode 100644
index a0f1f25df0ec..000000000000
--- a/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectSummaryStep.form
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.intellij.ide.projectWizard.ProjectSummaryStep">
- <grid id="27dc6" binding="myRootPanel" layout-manager="GridLayoutManager" row-count="2" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
- <margin top="0" left="0" bottom="0" right="0"/>
- <constraints>
- <xy x="20" y="20" width="500" height="400"/>
- </constraints>
- <properties/>
- <border type="none"/>
- <children>
- <grid id="15993" binding="myNameAndLocationPanel" layout-manager="BorderLayout" hgap="0" vgap="0">
- <constraints>
- <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
- </constraints>
- <properties/>
- <border type="none"/>
- <children/>
- </grid>
- <vspacer id="c6894">
- <constraints>
- <grid row="1" column="0" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
- </constraints>
- </vspacer>
- </children>
- </grid>
-</form>
diff --git a/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectSummaryStep.java b/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectSummaryStep.java
deleted file mode 100644
index 28e9cec7dee9..000000000000
--- a/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectSummaryStep.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright 2000-2013 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.intellij.ide.projectWizard;
-
-import com.intellij.ide.util.projectWizard.NamePathComponent;
-import com.intellij.ide.util.projectWizard.WizardContext;
-import com.intellij.ide.wizard.CommitStepException;
-import com.intellij.ide.wizard.StepAdapter;
-
-import javax.swing.*;
-import java.awt.*;
-
-/**
- * @author Dmitry Avdeev
- * Date: 20.09.13
- */
-public class ProjectSummaryStep extends StepAdapter {
-
- private final WizardContext myWizardContext;
- private JPanel myRootPanel;
- private JPanel myNameAndLocationPanel;
- private final NamePathComponent myNamePathComponent;
-
- public ProjectSummaryStep(WizardContext context) {
- myWizardContext = context;
- myNamePathComponent = NamePathComponent.initNamePathComponent(myWizardContext);
- myNameAndLocationPanel.add(myNamePathComponent, BorderLayout.CENTER);
- }
-
- @Override
- public void _commit(boolean finishChosen) throws CommitStepException {
- myWizardContext.setProjectName(myNamePathComponent.getNameValue());
- myWizardContext.setProjectFileDirectory(myNamePathComponent.getPath());
- }
-
- @Override
- public JComponent getComponent() {
- return myRootPanel;
- }
-
- @Override
- public JComponent getPreferredFocusedComponent() {
- return myNamePathComponent.getNameComponent();
- }
-}
diff --git a/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypeStep.form b/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypeStep.form
index 000469cc2a44..1eaf1286e09e 100644
--- a/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypeStep.form
+++ b/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypeStep.form
@@ -45,29 +45,7 @@
<BorderFactoryClass class="java.lang.String" value="com.intellij.ui.IdeBorderFactory$PlainSmallWithoutIndent"/>
</clientProperties>
<border type="none"/>
- <children>
- <grid id="4ffce" layout-manager="GridLayoutManager" row-count="2" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
- <margin top="0" left="0" bottom="0" right="0"/>
- <constraints>
- <card name="group description card"/>
- </constraints>
- <properties/>
- <border type="none"/>
- <children>
- <component id="3c23c" class="com.intellij.ui.components.JBLabel" binding="myGroupDescriptionLabel">
- <constraints>
- <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="2" hsize-policy="0" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
- </constraints>
- <properties/>
- </component>
- <vspacer id="617a5">
- <constraints>
- <grid row="1" column="0" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
- </constraints>
- </vspacer>
- </children>
- </grid>
- </children>
+ <children/>
</grid>
</children>
</grid>
diff --git a/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypeStep.java b/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypeStep.java
index 3efa81829db1..4c66356d3034 100644
--- a/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypeStep.java
+++ b/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypeStep.java
@@ -15,6 +15,7 @@
*/
package com.intellij.ide.projectWizard;
+import com.intellij.CommonBundle;
import com.intellij.framework.addSupport.FrameworkSupportInModuleProvider;
import com.intellij.ide.util.frameworkSupport.FrameworkRole;
import com.intellij.ide.util.frameworkSupport.FrameworkSupportUtil;
@@ -25,19 +26,35 @@ import com.intellij.ide.util.newProjectWizard.modes.CreateFromTemplateMode;
import com.intellij.ide.util.projectWizard.ModuleBuilder;
import com.intellij.ide.util.projectWizard.ModuleWizardStep;
import com.intellij.ide.util.projectWizard.WizardContext;
+import com.intellij.ide.wizard.CommitStepException;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.module.Module;
+import com.intellij.openapi.progress.ProgressIndicator;
+import com.intellij.openapi.progress.ProgressManager;
+import com.intellij.openapi.progress.Task;
import com.intellij.openapi.project.Project;
+import com.intellij.openapi.project.ProjectBundle;
import com.intellij.openapi.roots.ModifiableRootModel;
import com.intellij.openapi.roots.ui.configuration.ModulesProvider;
import com.intellij.openapi.roots.ui.configuration.projectRoot.LibrariesContainer;
import com.intellij.openapi.roots.ui.configuration.projectRoot.LibrariesContainerFactory;
+import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.openapi.wm.IdeFocusManager;
import com.intellij.platform.ProjectTemplate;
-import com.intellij.ui.components.JBLabel;
+import com.intellij.platform.ProjectTemplateEP;
+import com.intellij.platform.templates.ArchivedProjectTemplate;
+import com.intellij.platform.templates.LocalArchivedTemplate;
+import com.intellij.platform.templates.RemoteTemplatesFactory;
+import com.intellij.ui.*;
import com.intellij.ui.components.JBList;
+import com.intellij.ui.tabs.TabInfo;
+import com.intellij.ui.tabs.TabsListener;
+import com.intellij.ui.tabs.impl.JBTabsImpl;
+import com.intellij.util.Function;
+import com.intellij.util.containers.ConcurrentMultiMap;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.FactoryMap;
import com.intellij.util.containers.MultiMap;
@@ -49,6 +66,7 @@ import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
+import java.net.URL;
import java.util.*;
import java.util.List;
@@ -56,18 +74,21 @@ import java.util.List;
* @author Dmitry Avdeev
* Date: 04.09.13
*/
-public class ProjectTypeStep extends ModuleWizardStep {
+public class ProjectTypeStep extends ModuleWizardStep implements Disposable {
private static final String FRAMEWORKS_CARD = "frameworks card";
- private static final String GROUP_CARD = "group description card";
private final WizardContext myContext;
private final NewProjectWizard myWizard;
private final ModulesProvider myModulesProvider;
+ private final JTextPane myTemplateDescription;
private JPanel myPanel;
private JPanel myOptionsPanel;
- private JBLabel myGroupDescriptionLabel;
private JBList myProjectTypeList;
- private final ProjectTypesList myList;
+
+ private final ProjectTypesList myProjectTypesList;
+ private final JBList myTemplatesList;
+ private final TabInfo myFrameworksTab;
+ private final TabInfo myTemplatesTab;
@SuppressWarnings("MismatchedQueryAndUpdateOfCollection")
private final FactoryMap<ProjectCategory, ModuleBuilder> myBuilders = new FactoryMap<ProjectCategory, ModuleBuilder>() {
@@ -81,6 +102,9 @@ public class ProjectTypeStep extends ModuleWizardStep {
private final AddSupportForFrameworksPanel myFrameworksPanel;
private final ModuleBuilder.ModuleConfigurationUpdater myConfigurationUpdater;
+ private boolean myCommitted;
+ private final JBTabsImpl myTabs;
+ private final MultiMap<String, ProjectTemplate> myTemplates = loadLocalTemplates();
public ProjectTypeStep(WizardContext context, NewProjectWizard wizard, ModulesProvider modulesProvider) {
myContext = context;
@@ -124,80 +148,148 @@ public class ProjectTypeStep extends ModuleWizardStep {
}
}
- myList = new ProjectTypesList(myProjectTypeList, map);
+ myProjectTypesList = new ProjectTypesList(myProjectTypeList, map);
myProjectTypeList.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
-
@Override
public void valueChanged(ListSelectionEvent e) {
- ModuleBuilder builder = getSelectedBuilder();
- if (builder != null) {
- myContext.setProjectBuilder(builder);
- myWizard.getSequence().setType(builder.getBuilderId());
- builder.addModuleConfigurationUpdater(myConfigurationUpdater);
- }
- updateOptionsPanel(getSelectedObject());
+ projectTypeChanged(true);
}
});
for (ProjectCategory category : map.values()) {
myWizard.getSequence().addStepsForBuilder(myBuilders.get(category), context, modulesProvider);
}
-
myFrameworksPanel = new AddSupportForFrameworksPanel(Collections.<FrameworkSupportInModuleProvider>emptyList(), model, true);
Disposer.register(wizard.getDisposable(), myFrameworksPanel);
- myOptionsPanel.add(myFrameworksPanel.getMainPanel(), FRAMEWORKS_CARD);
+ myTemplatesList = new JBList();
+ myTemplatesList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+ myTemplatesList.setCellRenderer(new ColoredListCellRenderer<ProjectCategory>() {
+ @Override
+ protected void customizeCellRenderer(JList list, ProjectCategory value, int index, boolean selected, boolean hasFocus) {
+ append(value.getDisplayName()).setIcon(value.getIcon());
+ }
+ });
+ myTemplatesList.addListSelectionListener(new ListSelectionListener() {
+ @Override
+ public void valueChanged(ListSelectionEvent e) {
+ projectTypeChanged(false);
+ ProjectCategory type = (ProjectCategory)myTemplatesList.getSelectedValue();
+ myTemplateDescription.setText(type == null ? "" : type.getDescription());
+ }
+ });
+
+ myTabs = new JBTabsImpl(null, IdeFocusManager.findInstance(), this);
+ myFrameworksTab = new TabInfo(myFrameworksPanel.getMainPanel()).setText(" Frameworks ");
+ myTabs.addTab(myFrameworksTab);
+
+ JPanel templatesPanel = new JPanel(new BorderLayout());
+ templatesPanel.add(ScrollPaneFactory.createScrollPane(myTemplatesList, SideBorder.BOTTOM));
+ myTemplateDescription = new JTextPane();
+ myTemplateDescription.setBorder(IdeBorderFactory.createEmptyBorder(5, 5, 5, 5));
+ Messages.installHyperlinkSupport(myTemplateDescription);
+ templatesPanel.add(myTemplateDescription, BorderLayout.SOUTH);
+
+ myTemplatesTab = new TabInfo(templatesPanel).setText(" Templates ");
+ myTabs.addTab(myTemplatesTab);
+ myOptionsPanel.add(myTabs.getComponent(), FRAMEWORKS_CARD);
+
+ myTabs.addListener(new TabsListener.Adapter() {
+ @Override
+ public void selectionChanged(TabInfo oldSelection, TabInfo newSelection) {
+ projectTypeChanged(false);
+ }
+ });
+ }
+
+ // new category or template is selected
+ public void projectTypeChanged(boolean updatePanel) {
+ ModuleBuilder builder = getSelectedBuilder();
+ if (builder != null) {
+ myContext.setProjectBuilder(builder);
+ myWizard.getSequence().setType(builder.getBuilderId());
+ if (myFrameworksTab == myTabs.getSelectedInfo()) {
+ builder.addModuleConfigurationUpdater(myConfigurationUpdater);
+ }
+ }
+ if (updatePanel) {
+ ProjectCategory type = getSelectedProjectType();
+ if (type != null) {
+ updateOptionsPanel(type);
+ }
+ }
}
@Nullable
- public ProjectCategory getSelectedObject() {
- return myList.getSelectedTemplate();
+ public ProjectCategory getSelectedProjectType() {
+ if (myTabs.getSelectedInfo() == myFrameworksTab) {
+ return myProjectTypesList.getSelectedType();
+ }
+ else {
+ return (ProjectCategory)myTemplatesList.getSelectedValue();
+ }
}
@Nullable
private ModuleBuilder getSelectedBuilder() {
- ProjectCategory object = getSelectedObject();
+ ProjectCategory object = getSelectedProjectType();
return object == null ? null : myBuilders.get(object);
}
- private void updateOptionsPanel(Object object) {
- String card = GROUP_CARD;
- if (object instanceof ProjectCategory) {
- final ProjectCategory projectCategory = (ProjectCategory)object;
- ModuleBuilder builder = myBuilders.get(projectCategory);
- JComponent panel = builder.getCustomOptionsPanel(new Disposable() {
- @Override
- public void dispose() {
- disposeUIResources();
- }
- });
- if (panel != null) {
- card = builder.getBuilderId();
- if (myCards.add(card)) {
- myOptionsPanel.add(panel, card);
- }
+ private void updateOptionsPanel(final @NotNull ProjectCategory projectCategory) {
+ ModuleBuilder builder = myBuilders.get(projectCategory);
+ JComponent panel = builder.getCustomOptionsPanel(new Disposable() {
+ @Override
+ public void dispose() {
+ disposeUIResources();
}
- else {
- card = FRAMEWORKS_CARD;
- List<FrameworkSupportInModuleProvider> allProviders = FrameworkSupportUtil.getProviders(builder);
- List<FrameworkSupportInModuleProvider> matched =
- ContainerUtil.filter(allProviders, new Condition<FrameworkSupportInModuleProvider>() {
- @Override
- public boolean value(FrameworkSupportInModuleProvider provider) {
- return matchFramework(projectCategory, provider);
- }
- });
-
- myFrameworksPanel.setProviders(matched, new HashSet<String>(Arrays.asList(projectCategory.getAssociatedFrameworkIds())));
+ });
+ String card;
+ if (panel != null) {
+ card = builder.getBuilderId();
+ if (myCards.add(card)) {
+ myOptionsPanel.add(panel, card);
}
}
- else if (object instanceof TemplatesGroup) {
- myGroupDescriptionLabel.setText(((TemplatesGroup)object).getDescription());
+ else {
+ card = FRAMEWORKS_CARD;
+ List<FrameworkSupportInModuleProvider> allProviders = FrameworkSupportUtil.getProviders(builder);
+ List<FrameworkSupportInModuleProvider> matched =
+ ContainerUtil.filter(allProviders, new Condition<FrameworkSupportInModuleProvider>() {
+ @Override
+ public boolean value(FrameworkSupportInModuleProvider provider) {
+ return matchFramework(projectCategory, provider);
+ }
+ });
+
+ myFrameworksPanel.setProviders(matched,
+ new HashSet<String>(Arrays.asList(projectCategory.getAssociatedFrameworkIds())),
+ new HashSet<String>(Arrays.asList(projectCategory.getPreselectedFrameworkIds())));
+
+ boolean hasTemplates = updateTemplates(projectCategory, true);
+ myFrameworksTab.setEnabled(!matched.isEmpty() || !hasTemplates);
}
((CardLayout)myOptionsPanel.getLayout()).show(myOptionsPanel, card);
}
+ private boolean updateTemplates(ProjectCategory projectCategory, boolean initial) {
+ List<ProjectCategory> templates = ContainerUtil.map(myTemplates.get(projectCategory.getId()), new Function<ProjectTemplate, ProjectCategory>() {
+ @Override
+ public ProjectCategory fun(ProjectTemplate template) {
+ return new TemplateBasedProjectType(template);
+ }
+ });
+
+ //noinspection unchecked
+ myTemplatesList.setModel(new CollectionListModel<ProjectCategory>(templates));
+ myTemplatesTab.setEnabled(!templates.isEmpty());
+ if (initial && !templates.isEmpty()) {
+ myTemplatesList.setSelectedIndex(0);
+ }
+ return !templates.isEmpty();
+ }
+
private boolean matchFramework(ProjectCategory projectCategory, FrameworkSupportInModuleProvider framework) {
if (!framework.isEnabledForModuleBuilder(myBuilders.get(projectCategory))) return false;
@@ -223,12 +315,29 @@ public class ProjectTypeStep extends ModuleWizardStep {
@Override
public void updateStep() {
- myList.resetSelection();
+ myProjectTypesList.resetSelection();
+ loadRemoteTemplates();
}
@Override
public void onStepLeaving() {
- myList.saveSelection();
+ myProjectTypesList.saveSelection();
+ }
+
+ @Override
+ public void onWizardFinished() throws CommitStepException {
+ if (!myCommitted && myTabs.getSelectedInfo() == myFrameworksTab) {
+ boolean ok = myFrameworksPanel.downloadLibraries();
+ if (!ok) {
+ int answer = Messages.showYesNoDialog(getComponent(),
+ ProjectBundle.message("warning.message.some.required.libraries.wasn.t.downloaded"),
+ CommonBundle.getWarningTitle(), Messages.getWarningIcon());
+ if (answer != 0) {
+ throw new CommitStepException(null);
+ }
+ }
+ myCommitted = true;
+ }
}
@Override
@@ -243,6 +352,63 @@ public class ProjectTypeStep extends ModuleWizardStep {
@TestOnly
public boolean setSelectedProjectType(String group, String name) {
- return myList.setSelectedTemplate(group, name);
+ return myProjectTypesList.setSelectedType(group, name);
+ }
+
+ @Override
+ public void dispose() {
+ }
+
+ @Override
+ public void disposeUIResources() {
+ Disposer.dispose(this);
+ }
+
+ private static MultiMap<String, ProjectTemplate> loadLocalTemplates() {
+ ConcurrentMultiMap<String, ProjectTemplate> map = new ConcurrentMultiMap<String, ProjectTemplate>();
+ ProjectTemplateEP[] extensions = ProjectTemplateEP.EP_NAME.getExtensions();
+ for (ProjectTemplateEP ep : extensions) {
+ ClassLoader classLoader = ep.getLoaderForClass();
+ URL url = classLoader.getResource(ep.templatePath);
+ if (url != null) {
+ map.putValue(ep.projectType, new LocalArchivedTemplate(url, classLoader));
+ }
+ }
+ return map;
+ }
+
+ private void loadRemoteTemplates() {
+ ProgressManager.getInstance().run(new Task.Backgroundable(myContext.getProject(), "Loading Templates") {
+ @Override
+ public void run(@NotNull ProgressIndicator indicator) {
+ try {
+ myTemplatesList.setPaintBusy(true);
+ RemoteTemplatesFactory factory = new RemoteTemplatesFactory();
+ String[] groups = factory.getGroups();
+ for (String group : groups) {
+ ProjectTemplate[] templates = factory.createTemplates(group, myContext);
+ for (ProjectTemplate template : templates) {
+ String id = ((ArchivedProjectTemplate)template).getCategory();
+ myTemplates.putValue(id == null ? group : id, template);
+ }
+ }
+ //noinspection SSBasedInspection
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ int index = myTemplatesList.getSelectedIndex();
+ ProjectCategory type = myProjectTypesList.getSelectedType();
+ if (type != null) {
+ updateTemplates(type, false);
+ }
+ myTemplatesList.setSelectedIndex(index);
+ }
+ });
+ }
+ finally {
+ myTemplatesList.setPaintBusy(false);
+ }
+ }
+ });
+
}
}
diff --git a/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypesList.java b/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypesList.java
index ddac3b1c9927..b5d60bc7f024 100644
--- a/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypesList.java
+++ b/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypesList.java
@@ -125,7 +125,7 @@ public class ProjectTypesList implements Disposable {
void resetSelection() {
if (myList.getSelectedIndex() != -1) return;
SelectTemplateSettings settings = SelectTemplateSettings.getInstance();
- if (settings.getLastGroup() == null || !setSelectedTemplate(settings.getLastGroup(), settings.getLastTemplate())) {
+ if (settings.getLastGroup() == null || !setSelectedType(settings.getLastGroup(), settings.getLastTemplate())) {
myList.setSelectedIndex(0);
}
}
@@ -151,12 +151,12 @@ public class ProjectTypesList implements Disposable {
}
@Nullable
- public ProjectCategory getSelectedTemplate() {
+ public ProjectCategory getSelectedType() {
Object value = myList.getSelectedValue();
return value instanceof TemplateItem ? ((TemplateItem)value).myTemplate : null;
}
- public boolean setSelectedTemplate(@Nullable String group, @Nullable String name) {
+ public boolean setSelectedType(@Nullable String group, @Nullable String name) {
for (int i = 0; i < myList.getModel().getSize(); i++) {
Object o = myList.getModel().getElementAt(i);
if (o instanceof TemplateItem && ((TemplateItem)o).myGroup.equals(group) && ((TemplateItem)o).getName().equals(name)) {
@@ -173,7 +173,7 @@ public class ProjectTypesList implements Disposable {
public void dispose() {
}
- class TemplateItem {
+ static class TemplateItem {
private final ProjectCategory myTemplate;
private final String myGroup;
diff --git a/java/idea-ui/src/com/intellij/ide/projectWizard/TemplateBasedProjectType.java b/java/idea-ui/src/com/intellij/ide/projectWizard/TemplateBasedProjectType.java
index 8f462aea22aa..e9eefe505881 100644
--- a/java/idea-ui/src/com/intellij/ide/projectWizard/TemplateBasedProjectType.java
+++ b/java/idea-ui/src/com/intellij/ide/projectWizard/TemplateBasedProjectType.java
@@ -17,12 +17,10 @@ package com.intellij.ide.projectWizard;
import com.intellij.ide.util.projectWizard.ModuleBuilder;
import com.intellij.platform.ProjectTemplate;
-import com.intellij.platform.templates.ArchivedTemplatesFactory;
import com.intellij.platform.templates.LocalArchivedTemplate;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
-import java.io.File;
import java.net.URL;
/**
@@ -36,8 +34,7 @@ public class TemplateBasedProjectType extends ProjectCategory {
public TemplateBasedProjectType(String templatePath) {
URL resource = getClass().getResource(templatePath);
assert resource != null : templatePath;
- String name = ArchivedTemplatesFactory.getTemplateName(new File(templatePath).getName());
- myTemplate = new LocalArchivedTemplate(name, resource, getClass().getClassLoader());
+ myTemplate = new LocalArchivedTemplate(resource, getClass().getClassLoader());
}
public TemplateBasedProjectType(ProjectTemplate template) {
diff --git a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/AbstractProjectWizard.java b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/AbstractProjectWizard.java
index 60f6f6981cc8..4de1dda33846 100644
--- a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/AbstractProjectWizard.java
+++ b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/AbstractProjectWizard.java
@@ -31,11 +31,13 @@ import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.ui.IdeBorderFactory;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.TestOnly;
+import javax.swing.*;
import java.awt.*;
import java.io.File;
@@ -56,6 +58,14 @@ public abstract class AbstractProjectWizard extends AbstractWizard<ModuleWizardS
myWizardContext = initContext(project, null);
}
+ @Override
+ protected String addStepComponent(Component component) {
+ if (component instanceof JComponent) {
+ ((JComponent)component).setBorder(IdeBorderFactory.createEmptyBorder(0, 0, 0, 0));
+ }
+ return super.addStepComponent(component);
+ }
+
public abstract StepSequence getSequence();
private static WizardContext initContext(@Nullable Project project, @Nullable String defaultPath) {
@@ -156,15 +166,21 @@ public abstract class AbstractProjectWizard extends AbstractWizard<ModuleWizardS
step._commit(true);
}
catch (CommitStepException e) {
- String message = e.getMessage();
- if (message != null) {
- Messages.showErrorDialog(getCurrentStepComponent(), message);
- }
+ handleCommitException(e);
return;
}
if (!isLastStep(idx)) {
idx = getNextStep(idx);
} else {
+ for (ModuleWizardStep wizardStep : mySteps) {
+ try {
+ wizardStep.onWizardFinished();
+ }
+ catch (CommitStepException e) {
+ handleCommitException(e);
+ return;
+ }
+ }
break;
}
} while (true);
@@ -176,6 +192,13 @@ public abstract class AbstractProjectWizard extends AbstractWizard<ModuleWizardS
super.doOKAction();
}
+ private void handleCommitException(CommitStepException e) {
+ String message = e.getMessage();
+ if (message != null) {
+ Messages.showErrorDialog(getCurrentStepComponent(), message);
+ }
+ }
+
protected boolean commitStepData(final ModuleWizardStep step) {
try {
if (!step.validate()) {
diff --git a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/AddModuleWizard.java b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/AddModuleWizard.java
index 31af15d98b09..13f019e21147 100644
--- a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/AddModuleWizard.java
+++ b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/AddModuleWizard.java
@@ -36,13 +36,11 @@ import com.intellij.openapi.roots.ui.configuration.ModulesProvider;
import com.intellij.openapi.util.Condition;
import com.intellij.projectImport.ProjectImportBuilder;
import com.intellij.projectImport.ProjectImportProvider;
-import com.intellij.ui.IdeBorderFactory;
import com.intellij.util.Function;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.TestOnly;
-import javax.swing.*;
import java.awt.*;
public class AddModuleWizard extends AbstractProjectWizard {
@@ -135,14 +133,6 @@ public class AddModuleWizard extends AbstractProjectWizard {
}
@Override
- protected String addStepComponent(Component component) {
- if (component instanceof JComponent) {
- ((JComponent)component).setBorder(IdeBorderFactory.createEmptyBorder(0, 0, 0, 0));
- }
- return super.addStepComponent(component);
- }
-
- @Override
public StepSequence getSequence() {
return myWizardMode.getSteps(myWizardContext, myModulesProvider);
}
diff --git a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/AddSupportForFrameworksPanel.java b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/AddSupportForFrameworksPanel.java
index 26571042d3df..79cace7526cf 100644
--- a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/AddSupportForFrameworksPanel.java
+++ b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/AddSupportForFrameworksPanel.java
@@ -108,7 +108,7 @@ public class AddSupportForFrameworksPanel implements Disposable {
((DefaultTreeModel)myFrameworksTree.getModel()).nodeChanged(getSelectedNode());
}
}, this);
- setProviders(providers, Collections.<String>emptySet());
+ setProviders(providers, Collections.<String>emptySet(), Collections.<String>emptySet());
myFrameworksTree.addTreeSelectionListener(new TreeSelectionListener() {
public void valueChanged(TreeSelectionEvent e) {
@@ -129,10 +129,15 @@ public class AddSupportForFrameworksPanel implements Disposable {
}
- public void setProviders(List<FrameworkSupportInModuleProvider> providers, Set<String> associated) {
+ public void setProviders(List<FrameworkSupportInModuleProvider> providers, Set<String> associated, Set<String> preselected) {
myProviders = providers;
myAssociatedFrameworks = createNodes(myProviders, associated);
+ for (FrameworkSupportNodeBase node : myRoots) {
+ if (preselected.contains(node.getId())) {
+ node.setChecked(true);
+ }
+ }
setAssociatedFrameworks();
myFrameworksTree.setRoots(myRoots);
@@ -253,7 +258,7 @@ public class AddSupportForFrameworksPanel implements Disposable {
private List<LibraryCompositionSettings> getLibrariesCompositionSettingsList() {
List<LibraryCompositionSettings> list = new ArrayList<LibraryCompositionSettings>();
- List<FrameworkSupportNode> selected = getFrameworkNodes(true);
+ List<FrameworkSupportNode> selected = getSelectedNodes();
for (FrameworkSupportNode node : selected) {
ContainerUtil.addIfNotNull(list, getLibraryCompositionSettings(node));
}
@@ -349,34 +354,33 @@ public class AddSupportForFrameworksPanel implements Disposable {
}
public boolean hasSelectedFrameworks() {
- return !getFrameworkNodes(true).isEmpty();
+ return !getSelectedNodes().isEmpty();
}
- private List<FrameworkSupportNode> getFrameworkNodes(final boolean selectedOnly) {
+ private List<FrameworkSupportNode> getSelectedNodes() {
List<FrameworkSupportNode> list = new ArrayList<FrameworkSupportNode>();
if (myRoots != null) {
- addChildFrameworks(myRoots, list, selectedOnly);
+ addChildFrameworks(myRoots, list);
}
+ list.addAll(ContainerUtil.mapNotNull(myAssociatedFrameworks, new Function.InstanceOf<FrameworkSupportNodeBase, FrameworkSupportNode>(FrameworkSupportNode.class)));
return list;
}
- private static void addChildFrameworks(final List<FrameworkSupportNodeBase> list, final List<FrameworkSupportNode> result,
- final boolean selectedOnly) {
+ private static void addChildFrameworks(final List<FrameworkSupportNodeBase> list, final List<FrameworkSupportNode> result) {
for (FrameworkSupportNodeBase node : list) {
- if (!selectedOnly || node.isChecked() || node instanceof FrameworkGroupNode) {
+ if (node.isChecked() || node instanceof FrameworkGroupNode) {
if (node instanceof FrameworkSupportNode) {
result.add((FrameworkSupportNode)node);
}
//noinspection unchecked
- addChildFrameworks(node.getChildren(), result, selectedOnly);
+ addChildFrameworks(node.getChildren(), result);
}
}
}
public void addSupport(final @NotNull Module module, final @NotNull ModifiableRootModel rootModel) {
List<Library> addedLibraries = new ArrayList<Library>();
- List<FrameworkSupportNode> selectedFrameworks = getFrameworkNodes(true);
- selectedFrameworks.addAll(ContainerUtil.mapNotNull(myAssociatedFrameworks, new Function.InstanceOf<FrameworkSupportNodeBase, FrameworkSupportNode>(FrameworkSupportNode.class)));
+ List<FrameworkSupportNode> selectedFrameworks = getSelectedNodes();
sortFrameworks(selectedFrameworks);
List<FrameworkSupportConfigurable> selectedConfigurables = new ArrayList<FrameworkSupportConfigurable>();
final IdeaModifiableModelsProvider modifiableModelsProvider = new IdeaModifiableModelsProvider();
diff --git a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworkSupportOptionsComponent.java b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworkSupportOptionsComponent.java
index 8237baf4538e..1b5c3b9404c8 100644
--- a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworkSupportOptionsComponent.java
+++ b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworkSupportOptionsComponent.java
@@ -100,7 +100,7 @@ public class FrameworkSupportOptionsComponent {
myLibraryOptionsPanel = new LibraryOptionsPanel(description, myModel.getBaseDirectoryForLibrariesPath(), createLibraryVersionFilter(),
container, !myConfigurable.isOnlyLibraryAdded()) {
@Override
- protected void onVersionChanged(FrameworkLibraryVersion version) {
+ protected void onVersionChanged(@Nullable String version) {
if (myFrameworkVersionComponent == null) {
myModel.setSelectedLibraryVersion(provider.getId(), version);
}
diff --git a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworksTree.java b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworksTree.java
index 6dcd22561e80..dc2cecdd5422 100644
--- a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworksTree.java
+++ b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworksTree.java
@@ -16,7 +16,6 @@
package com.intellij.ide.util.newProjectWizard;
import com.intellij.framework.FrameworkOrGroup;
-import com.intellij.framework.PresentableVersion;
import com.intellij.ide.util.newProjectWizard.impl.FrameworkSupportModelBase;
import com.intellij.ui.CheckboxTree;
import com.intellij.ui.CheckedTreeNode;
@@ -114,9 +113,9 @@ public class FrameworksTree extends CheckboxTree {
getTextRenderer().append(node.getTitle(), attributes);
if (node.isChecked()) {
FrameworkOrGroup object = node.getUserObject();
- PresentableVersion version = myModel.getPresentableVersion(object.getId());
+ String version = myModel.getFrameworkVersion(object.getId());
if (version != null) {
- getTextRenderer().append(" (" + version.getVersionNumber() + ")", SimpleTextAttributes.GRAYED_ATTRIBUTES);
+ getTextRenderer().append(" (" + version + ")", SimpleTextAttributes.GRAYED_ATTRIBUTES);
}
}
getTextRenderer().setIcon(node.getIcon());
diff --git a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/LoadingProjectTemplate.java b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/LoadingProjectTemplate.java
index 2154ec25c4ed..9cd0f67c9549 100644
--- a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/LoadingProjectTemplate.java
+++ b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/LoadingProjectTemplate.java
@@ -27,7 +27,7 @@ import javax.swing.*;
* @author Dmitry Avdeev
* Date: 11/28/12
*/
-class LoadingProjectTemplate implements ProjectTemplate {
+public class LoadingProjectTemplate implements ProjectTemplate {
@NotNull
@Override
public String getName() {
diff --git a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/ProjectTypesList.java b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/ProjectTypesList.java
index 813eae735b90..1af97c19d3cd 100644
--- a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/ProjectTypesList.java
+++ b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/ProjectTypesList.java
@@ -68,7 +68,6 @@ public class ProjectTypesList implements Disposable {
}
}.setComparator(new SpeedSearchComparator(false));
List<TemplateItem> items = buildItems(map);
- final RemoteTemplatesFactory factory = new RemoteTemplatesFactory();
final TemplatesGroup samplesGroup = new TemplatesGroup("Loading Templates...", "", null, 0);
myLoadingItem = new TemplateItem(new LoadingProjectTemplate(), samplesGroup) {
@Override
@@ -84,6 +83,7 @@ public class ProjectTypesList implements Disposable {
items.add(myLoadingItem);
myModel = new CollectionListModel<TemplateItem>(items);
+ final RemoteTemplatesFactory factory = new RemoteTemplatesFactory();
ProgressManager.getInstance().run(new Task.Backgroundable(context.getProject(), "Loading Templates") {
@Override
public void run(@NotNull ProgressIndicator indicator) {
diff --git a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/SelectTemplateStep.java b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/SelectTemplateStep.java
index e1d46ea35e30..d0a353617b5b 100644
--- a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/SelectTemplateStep.java
+++ b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/SelectTemplateStep.java
@@ -519,6 +519,7 @@ public class SelectTemplateStep extends ModuleWizardStep implements SettingsStep
myModuleNameDocListenerEnabled = true;
}
+ @Override
@NotNull
public JTextField getModuleNameField() {
return myModuleName;
diff --git a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/impl/FrameworkSupportModelBase.java b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/impl/FrameworkSupportModelBase.java
index 3ac7333ce294..aa109764df9e 100644
--- a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/impl/FrameworkSupportModelBase.java
+++ b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/impl/FrameworkSupportModelBase.java
@@ -17,10 +17,8 @@ package com.intellij.ide.util.newProjectWizard.impl;
import com.intellij.facet.impl.ui.libraries.FrameworkLibraryProvider;
import com.intellij.framework.FrameworkVersion;
-import com.intellij.framework.PresentableVersion;
import com.intellij.framework.addSupport.FrameworkSupportInModuleProvider;
import com.intellij.framework.addSupport.FrameworkVersionListener;
-import com.intellij.framework.library.FrameworkLibraryVersion;
import com.intellij.ide.util.frameworkSupport.FrameworkSupportConfigurable;
import com.intellij.ide.util.frameworkSupport.FrameworkSupportModel;
import com.intellij.ide.util.frameworkSupport.FrameworkSupportModelListener;
@@ -55,7 +53,7 @@ public abstract class FrameworkSupportModelBase extends UserDataHolderBase imple
private final Map<String, FrameworkSupportNode> mySettingsMap = new HashMap<String, FrameworkSupportNode>();
private final Map<String, FrameworkSupportOptionsComponent> myOptionsComponentsMap = new HashMap<String, FrameworkSupportOptionsComponent>();
private final Map<String, FrameworkVersion> mySelectedVersions = new HashMap<String, FrameworkVersion>();
- private final Map<String, FrameworkLibraryVersion> myLibraryVersions = new HashMap<String, FrameworkLibraryVersion>();
+ private final Map<String, String> myFrameworkVersions = new HashMap<String, String>();
private FrameworkLibraryProvider myLibraryProvider;
public FrameworkSupportModelBase(final @Nullable Project project, @Nullable ModuleBuilder builder, @NotNull LibrariesContainer librariesContainer) {
@@ -169,7 +167,7 @@ public abstract class FrameworkSupportModelBase extends UserDataHolderBase imple
return myLibraryProvider;
}
- public void setLibraryProvider(FrameworkLibraryProvider libraryProvider) {
+ public void setLibraryProvider(@Nullable FrameworkLibraryProvider libraryProvider) {
myLibraryProvider = libraryProvider;
for (FrameworkSupportOptionsComponent optionsComponent : myOptionsComponentsMap.values()) {
optionsComponent.updateLibrariesPanel();
@@ -205,13 +203,13 @@ public abstract class FrameworkSupportModelBase extends UserDataHolderBase imple
return myLibrariesContainer;
}
- public void setSelectedLibraryVersion(String id, FrameworkLibraryVersion version) {
- myLibraryVersions.put(id, version);
+ public void setSelectedLibraryVersion(String id, String version) {
+ myFrameworkVersions.put(id, version);
myVersionEventDispatcher.getMulticaster().versionChanged(getSelectedVersion(id));
}
- public PresentableVersion getPresentableVersion(String id) {
+ public String getFrameworkVersion(String id) {
FrameworkVersion version = mySelectedVersions.get(id);
- return version == null ? myLibraryVersions.get(id) : version;
+ return version == null ? myFrameworkVersions.get(id) : version.getVersionNumber();
}
}
diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/ExistingLibraryEditor.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/ExistingLibraryEditor.java
index 7e4b7721619e..d33dbb50f2d1 100644
--- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/ExistingLibraryEditor.java
+++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/ExistingLibraryEditor.java
@@ -71,10 +71,13 @@ public class ExistingLibraryEditor extends LibraryEditorBase implements Disposab
private LibraryType detectType() {
if (!myDetectedTypeComputed) {
- final Pair<LibraryType<?>,LibraryProperties<?>> pair = LibraryDetectionManager.getInstance().detectType(Arrays.asList(getFiles(OrderRootType.CLASSES)));
- if (pair != null) {
- myDetectedType = pair.getFirst();
- myDetectedLibraryProperties = pair.getSecond();
+ LibraryTable libraryTable = myLibrary.getTable();
+ if (libraryTable == null || libraryTable.isEditable()) {
+ final Pair<LibraryType<?>,LibraryProperties<?>> pair = LibraryDetectionManager.getInstance().detectType(Arrays.asList(getFiles(OrderRootType.CLASSES)));
+ if (pair != null) {
+ myDetectedType = pair.getFirst();
+ myDetectedLibraryProperties = pair.getSecond();
+ }
}
myDetectedTypeComputed = true;
}
diff --git a/java/idea-ui/src/com/intellij/platform/templates/ArchivedProjectTemplate.java b/java/idea-ui/src/com/intellij/platform/templates/ArchivedProjectTemplate.java
index adc9ddd65c36..8937dd97dcc8 100644
--- a/java/idea-ui/src/com/intellij/platform/templates/ArchivedProjectTemplate.java
+++ b/java/idea-ui/src/com/intellij/platform/templates/ArchivedProjectTemplate.java
@@ -35,9 +35,11 @@ import java.util.zip.ZipInputStream;
public abstract class ArchivedProjectTemplate implements ProjectTemplate {
protected final String myDisplayName;
+ @Nullable private final String myCategory;
- public ArchivedProjectTemplate(@NotNull String displayName) {
+ public ArchivedProjectTemplate(@NotNull String displayName, @Nullable String category) {
myDisplayName = displayName;
+ myCategory = category;
}
@NotNull
@@ -67,4 +69,9 @@ public abstract class ArchivedProjectTemplate implements ProjectTemplate {
}
public abstract ZipInputStream getStream() throws IOException;
+
+ @Nullable
+ public String getCategory() {
+ return myCategory;
+ }
}
diff --git a/java/idea-ui/src/com/intellij/platform/templates/ArchivedTemplatesFactory.java b/java/idea-ui/src/com/intellij/platform/templates/ArchivedTemplatesFactory.java
index 08c673fb1f55..b2ea5025efd2 100644
--- a/java/idea-ui/src/com/intellij/platform/templates/ArchivedTemplatesFactory.java
+++ b/java/idea-ui/src/com/intellij/platform/templates/ArchivedTemplatesFactory.java
@@ -17,7 +17,7 @@ package com.intellij.platform.templates;
import com.intellij.ide.fileTemplates.impl.UrlUtil;
import com.intellij.ide.plugins.IdeaPluginDescriptor;
-import com.intellij.ide.plugins.PluginManager;
+import com.intellij.ide.plugins.PluginManagerCore;
import com.intellij.ide.util.projectWizard.WizardContext;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.diagnostic.Logger;
@@ -41,14 +41,14 @@ import java.util.*;
*/
public class ArchivedTemplatesFactory extends ProjectTemplatesFactory {
- private static final String ZIP = ".zip";
+ static final String ZIP = ".zip";
private final ClearableLazyValue<MultiMap<String, Pair<URL, ClassLoader>>> myGroups = new ClearableLazyValue<MultiMap<String, Pair<URL, ClassLoader>>>() {
@NotNull
@Override
protected MultiMap<String, Pair<URL, ClassLoader>> compute() {
MultiMap<String, Pair<URL, ClassLoader>> map = new MultiMap<String, Pair<URL, ClassLoader>>();
- IdeaPluginDescriptor[] plugins = PluginManager.getPlugins();
+ IdeaPluginDescriptor[] plugins = PluginManagerCore.getPlugins();
Map<URL, ClassLoader> urls = new HashMap<URL, ClassLoader>();
for (IdeaPluginDescriptor plugin : plugins) {
if (!plugin.isEnabled()) continue;
@@ -83,7 +83,8 @@ public class ArchivedTemplatesFactory extends ProjectTemplatesFactory {
if (index != -1) {
child = child.substring(0, index);
}
- map.putValue(child.replace('_', ' '), Pair.create(new URL(url.getKey().toExternalForm() + "/" + child), url.getValue()));
+ String name = child.replace('_', ' ');
+ map.putValue(name, Pair.create(new URL(url.getKey().toExternalForm() + "/" + child), url.getValue()));
}
}
catch (IOException e) {
@@ -132,8 +133,7 @@ public class ArchivedTemplatesFactory extends ProjectTemplatesFactory {
for (String child : children) {
if (child.endsWith(ZIP)) {
URL templateUrl = new URL(url.first.toExternalForm() + "/" + child);
- String name = getTemplateName(child);
- templates.add(new LocalArchivedTemplate(name, templateUrl, url.second));
+ templates.add(new LocalArchivedTemplate(templateUrl, url.second));
}
}
}
@@ -144,10 +144,6 @@ public class ArchivedTemplatesFactory extends ProjectTemplatesFactory {
return templates.toArray(new ProjectTemplate[templates.size()]);
}
- public static String getTemplateName(String child) {
- return child.substring(0, child.length() - ZIP.length()).replace('_', ' ');
- }
-
@Override
public int getGroupWeight(String group) {
return CUSTOM_GROUP.equals(group) ? -2 : 0;
diff --git a/java/idea-ui/src/com/intellij/platform/templates/LocalArchivedTemplate.java b/java/idea-ui/src/com/intellij/platform/templates/LocalArchivedTemplate.java
index f671335e6d7e..e9c84800dafe 100644
--- a/java/idea-ui/src/com/intellij/platform/templates/LocalArchivedTemplate.java
+++ b/java/idea-ui/src/com/intellij/platform/templates/LocalArchivedTemplate.java
@@ -31,6 +31,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
+import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.Collections;
@@ -52,10 +53,9 @@ public class LocalArchivedTemplate extends ArchivedProjectTemplate {
private List<WizardInputField> myInputFields = Collections.emptyList();
private Icon myIcon;
- public LocalArchivedTemplate(@NotNull String displayName,
- @NotNull URL archivePath,
+ public LocalArchivedTemplate(@NotNull URL archivePath,
@NotNull ClassLoader classLoader) {
- super(displayName);
+ super(getTemplateName(archivePath), null);
myArchivePath = archivePath;
myModuleType = computeModuleType(this);
@@ -80,6 +80,11 @@ public class LocalArchivedTemplate extends ArchivedProjectTemplate {
}
}
+ private static String getTemplateName(URL url) {
+ String fileName = new File(url.getPath()).getName();
+ return fileName.substring(0, fileName.length() - ArchivedTemplatesFactory.ZIP.length()).replace('_', ' ');
+ }
+
@Override
public String getDescription() {
return readEntry(new Condition<ZipEntry>() {
diff --git a/java/idea-ui/src/com/intellij/platform/templates/RemoteTemplatesFactory.java b/java/idea-ui/src/com/intellij/platform/templates/RemoteTemplatesFactory.java
index d3db36470740..f62333ce30b2 100644
--- a/java/idea-ui/src/com/intellij/platform/templates/RemoteTemplatesFactory.java
+++ b/java/idea-ui/src/com/intellij/platform/templates/RemoteTemplatesFactory.java
@@ -147,7 +147,7 @@ public class RemoteTemplatesFactory extends ProjectTemplatesFactory {
final String path = element.getChildText("path", ns);
final String description = element.getChildTextTrim("description", ns);
String name = element.getChildTextTrim("name", ns);
- return new ArchivedProjectTemplate(name) {
+ return new ArchivedProjectTemplate(name, element.getChildTextTrim("category")) {
@Override
protected ModuleType getModuleType() {
return moduleType;
diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightClassUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightClassUtil.java
index 0a804c583a51..064888bf4215 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightClassUtil.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightClassUtil.java
@@ -539,6 +539,7 @@ public class HighlightClassUtil {
@NotNull PsiResolveHelper resolveHelper,
@NotNull TextRange range,
@NotNull PsiClassType[] handledExceptions) {
+ if (aClass instanceof PsiAnonymousClass) return null;
PsiClass baseClass = aClass.getSuperClass();
if (baseClass == null) return null;
PsiMethod[] constructors = baseClass.getConstructors();
diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java
index 7a89381553f8..8d845ff3023e 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java
@@ -31,6 +31,7 @@ import com.intellij.util.IncorrectOperationException;
import com.intellij.util.SmartList;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.Stack;
+import com.siyeh.ig.numeric.UnnecessaryExplicitNumericCastInspection;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
@@ -79,7 +80,7 @@ public class ControlFlowAnalyzer extends JavaElementVisitor {
myAssertionError = createClassType(manager, scope, JAVA_LANG_ASSERTION_ERROR);
myString = myFactory.createTypeValue(createClassType(manager, scope, JAVA_LANG_STRING), Nullness.NOT_NULL);
- PsiParameter mockVar = JavaPsiFacade.getElementFactory(manager.getProject()).createParameter("$exception$", createClassType(manager, scope, JAVA_LANG_OBJECT));
+ PsiParameter mockVar = JavaPsiFacade.getElementFactory(manager.getProject()).createParameterFromText("java.lang.Object $exception$", null);
myExceptionHolder = myFactory.getVarFactory().createVariableValue(mockVar, false);
myFields = new HashSet<DfaVariableValue>();
@@ -312,6 +313,14 @@ public class ControlFlowAnalyzer extends JavaElementVisitor {
}
}
}
+ else if (parent instanceof PsiTryStatement) {
+ PsiResourceList list = ((PsiTryStatement)parent).getResourceList();
+ if (list != null) {
+ for (PsiResourceVariable variable : list.getResourceVariables()) {
+ myCurrentFlow.removeVariable(variable);
+ }
+ }
+ }
}
@Override public void visitBlockStatement(PsiBlockStatement statement) {
@@ -1866,7 +1875,13 @@ public class ControlFlowAnalyzer extends JavaElementVisitor {
final PsiTypeElement typeElement = castExpression.getCastType();
if (typeElement != null && operand != null) {
- addInstruction(new TypeCastInstruction(castExpression, operand, typeElement.getType()));
+ if (typeElement.getType() instanceof PsiPrimitiveType &&
+ UnnecessaryExplicitNumericCastInspection.isPrimitiveNumericCastNecessary(castExpression)) {
+ addInstruction(new PopInstruction());
+ pushUnknown();
+ } else {
+ addInstruction(new TypeCastInstruction(castExpression, operand, typeElement.getType()));
+ }
}
finishElement(castExpression);
}
diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/miscGenerics/RedundantTypeArgsInspection.java b/java/java-analysis-impl/src/com/intellij/codeInspection/miscGenerics/RedundantTypeArgsInspection.java
index f94d1a600ba0..bb3c4ea3b8a9 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInspection/miscGenerics/RedundantTypeArgsInspection.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInspection/miscGenerics/RedundantTypeArgsInspection.java
@@ -15,6 +15,7 @@
*/
package com.intellij.codeInspection.miscGenerics;
+import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInsight.daemon.GroupNames;
import com.intellij.codeInspection.*;
import com.intellij.openapi.diagnostic.Logger;
@@ -150,6 +151,7 @@ public class RedundantTypeArgsInspection extends GenericsInspectionToolBase {
@Override
public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) {
final PsiReferenceParameterList typeArgumentList = (PsiReferenceParameterList)descriptor.getPsiElement();
+ if (!FileModificationService.getInstance().preparePsiElementForWrite(typeArgumentList)) return;
try {
final PsiMethodCallExpression expr =
(PsiMethodCallExpression)JavaPsiFacade.getInstance(project).getElementFactory().createExpressionFromText("foo()", null);
diff --git a/java/java-impl/src/com/intellij/codeInsight/ExpectedTypeInfoImpl.java b/java/java-impl/src/com/intellij/codeInsight/ExpectedTypeInfoImpl.java
index dd46437867c3..227825b4aced 100644
--- a/java/java-impl/src/com/intellij/codeInsight/ExpectedTypeInfoImpl.java
+++ b/java/java-impl/src/com/intellij/codeInsight/ExpectedTypeInfoImpl.java
@@ -17,10 +17,13 @@
package com.intellij.codeInsight;
import com.intellij.openapi.util.NullableComputable;
+import com.intellij.openapi.util.NullableLazyValue;
+import com.intellij.openapi.util.VolatileNullableLazyValue;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.PsiType;
import com.intellij.psi.util.PsiUtil;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
public class ExpectedTypeInfoImpl implements ExpectedTypeInfo {
public static final NullableComputable<String> NULL = new NullableComputable<String>() {
@@ -37,7 +40,8 @@ public class ExpectedTypeInfoImpl implements ExpectedTypeInfo {
@NotNull
private final TailType myTailType;
private final PsiMethod myCalledMethod;
- @NotNull private final NullableComputable<String> expectedName;
+ @NotNull private final NullableComputable<String> expectedNameComputable;
+ @NotNull private final NullableLazyValue<String> expectedNameLazyValue;
@Override
public int getKind() {
@@ -62,15 +66,22 @@ public class ExpectedTypeInfoImpl implements ExpectedTypeInfo {
this.myTailType = myTailType;
this.defaultType = defaultType;
myCalledMethod = calledMethod;
- this.expectedName = expectedName;
+ this.expectedNameComputable = expectedName;
+ expectedNameLazyValue = new VolatileNullableLazyValue<String>() {
+ @Nullable
+ @Override
+ protected String compute() {
+ return expectedNameComputable.compute();
+ }
+ };
PsiUtil.ensureValidType(type);
PsiUtil.ensureValidType(defaultType);
}
- @NotNull
- public NullableComputable<String> getExpectedName() {
- return expectedName;
+ @Nullable
+ public String getExpectedName() {
+ return expectedNameLazyValue.getValue();
}
@Override
diff --git a/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java b/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java
index bc6273eb1074..c9f75a0486b5 100644
--- a/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java
+++ b/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java
@@ -630,9 +630,15 @@ public class ExpectedTypesProvider {
myResult = visitor.getResult();
if (!(expr.getParent() instanceof PsiExpressionList)) {
for (int i = 0; i < myResult.length; i++) {
- ExpectedTypeInfo info = myResult[i];
+ final ExpectedTypeInfo info = myResult[i];
myResult[i] = createInfoImpl(info.getType(), info.getKind(), info.getDefaultType(), TailType.NONE, info.getCalledMethod(),
- ((ExpectedTypeInfoImpl)info).getExpectedName());
+ new NullableComputable<String>() {
+ @Nullable
+ @Override
+ public String compute() {
+ return ((ExpectedTypeInfoImpl)info).getExpectedName();
+ }
+ });
}
}
return;
@@ -870,9 +876,15 @@ public class ExpectedTypesProvider {
else if (myExpr.equals(expr.getThenExpression())) {
ExpectedTypeInfo[] types = getExpectedTypes(expr, myForCompletion);
for (int i = 0; i < types.length; i++) {
- ExpectedTypeInfo info = types[i];
+ final ExpectedTypeInfo info = types[i];
types[i] = createInfoImpl(info.getType(), info.getKind(), info.getDefaultType(), TailType.COND_EXPR_COLON, info.getCalledMethod(),
- ((ExpectedTypeInfoImpl)info).getExpectedName());
+ new NullableComputable<String>() {
+ @Nullable
+ @Override
+ public String compute() {
+ return ((ExpectedTypeInfoImpl)info).getExpectedName();
+ }
+ });
}
myResult = types;
}
diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/AllClassesGetter.java b/java/java-impl/src/com/intellij/codeInsight/completion/AllClassesGetter.java
index 1bdedafa4219..2367ce3deb11 100644
--- a/java/java-impl/src/com/intellij/codeInsight/completion/AllClassesGetter.java
+++ b/java/java-impl/src/com/intellij/codeInsight/completion/AllClassesGetter.java
@@ -25,6 +25,7 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Condition;
import com.intellij.psi.*;
import com.intellij.psi.impl.source.PostprocessReformattingAspect;
+import com.intellij.psi.impl.source.tree.java.PsiReferenceExpressionImpl;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.searches.AllClassesSearch;
import com.intellij.util.Consumer;
@@ -155,6 +156,10 @@ public class AllClassesGetter {
@Override
public boolean process(PsiClass psiClass) {
+ if (parameters.getInvocationCount() < 2 && PsiReferenceExpressionImpl.seemsScrambled(psiClass)) {
+ return true;
+ }
+
assert psiClass != null;
if (isAcceptableInContext(context, psiClass, filterByScope, pkgContext)) {
String qName = psiClass.getQualifiedName();
diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionSorting.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionSorting.java
index e2296e4c3d2c..cabc5d915fed 100644
--- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionSorting.java
+++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionSorting.java
@@ -227,7 +227,7 @@ public class JavaCompletionSorting {
private static int calcMatch(final List<String> words, int max, ExpectedTypeInfo[] myExpectedInfos) {
for (ExpectedTypeInfo myExpectedInfo : myExpectedInfos) {
- String expectedName = ((ExpectedTypeInfoImpl)myExpectedInfo).getExpectedName().compute();
+ String expectedName = ((ExpectedTypeInfoImpl)myExpectedInfo).getExpectedName();
if (expectedName == null) continue;
max = calcMatch(expectedName, words, max);
max = calcMatch(truncDigits(expectedName), words, max);
@@ -504,7 +504,7 @@ public class JavaCompletionSorting {
int max = 0;
final List<String> wordsNoDigits = NameUtil.nameToWordsLowerCase(truncDigits(name));
for (ExpectedTypeInfo myExpectedInfo : myExpectedTypes) {
- String expectedName = ((ExpectedTypeInfoImpl)myExpectedInfo).getExpectedName().compute();
+ String expectedName = ((ExpectedTypeInfoImpl)myExpectedInfo).getExpectedName();
if (expectedName != null) {
final THashSet<String> set = new THashSet<String>(NameUtil.nameToWordsLowerCase(truncDigits(expectedName)));
set.retainAll(wordsNoDigits);
diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionStatistician.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionStatistician.java
index bcc783643a91..c5c1e3994a46 100644
--- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionStatistician.java
+++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionStatistician.java
@@ -56,7 +56,7 @@ public class JavaCompletionStatistician extends CompletionStatistician{
PsiClass containingClass = ((PsiMember)o).getContainingClass();
if (containingClass != null) {
- String expectedName = firstInfo instanceof ExpectedTypeInfoImpl ? ((ExpectedTypeInfoImpl)firstInfo).getExpectedName().compute() : null;
+ String expectedName = firstInfo instanceof ExpectedTypeInfoImpl ? ((ExpectedTypeInfoImpl)firstInfo).getExpectedName() : null;
String contextPrefix = expectedName == null ? "" : "expectedName=" + expectedName + "###";
String context = contextPrefix + JavaStatisticsManager.getMemberUseKey2(containingClass);
diff --git a/java/java-impl/src/com/intellij/codeInsight/editorActions/wordSelection/ListSelectioner.java b/java/java-impl/src/com/intellij/codeInsight/editorActions/wordSelection/ListSelectioner.java
index 2404f21a17b0..a608c6e8b449 100644
--- a/java/java-impl/src/com/intellij/codeInsight/editorActions/wordSelection/ListSelectioner.java
+++ b/java/java-impl/src/com/intellij/codeInsight/editorActions/wordSelection/ListSelectioner.java
@@ -50,7 +50,9 @@ public class ListSelectioner extends BasicSelectioner {
}
List<TextRange> result = new ArrayList<TextRange>();
- result.add(new TextRange(start, end));
+ if (start != 0 && end != 0) {
+ result.add(new TextRange(start, end));
+ }
return result;
}
}
diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/ui/GenerateEqualsWizard.java b/java/java-impl/src/com/intellij/codeInsight/generation/ui/GenerateEqualsWizard.java
index 85e9674fc2bb..c051e3a2aa1c 100644
--- a/java/java-impl/src/com/intellij/codeInsight/generation/ui/GenerateEqualsWizard.java
+++ b/java/java-impl/src/com/intellij/codeInsight/generation/ui/GenerateEqualsWizard.java
@@ -243,7 +243,7 @@ public class GenerateEqualsWizard extends AbstractGenerateEqualsWizard<PsiClass,
@Override
protected void addSteps() {
if (myEqualsPanel != null) {
- addStep(new InstanceofOptionStep());
+ addStep(new InstanceofOptionStep(myClass.hasModifierProperty(PsiModifier.FINAL)));
}
super.addSteps();
}
@@ -322,9 +322,10 @@ public class GenerateEqualsWizard extends AbstractGenerateEqualsWizard<PsiClass,
private static class InstanceofOptionStep extends StepAdapter {
private final JComponent myPanel;
- private InstanceofOptionStep() {
+ private InstanceofOptionStep(boolean isFinal) {
final JCheckBox checkbox = new NonFocusableCheckBox(CodeInsightBundle.message("generate.equals.hashcode.accept.sublcasses"));
- checkbox.setSelected(CodeInsightSettings.getInstance().USE_INSTANCEOF_ON_EQUALS_PARAMETER);
+ checkbox.setSelected(!isFinal && CodeInsightSettings.getInstance().USE_INSTANCEOF_ON_EQUALS_PARAMETER);
+ checkbox.setEnabled(!isFinal);
checkbox.addActionListener(new ActionListener() {
public void actionPerformed(@NotNull final ActionEvent M) {
CodeInsightSettings.getInstance().USE_INSTANCEOF_ON_EQUALS_PARAMETER = checkbox.isSelected();
diff --git a/java/java-impl/src/com/intellij/externalSystem/JavaProjectDataService.java b/java/java-impl/src/com/intellij/externalSystem/JavaProjectDataService.java
index 47f4b0a3d4bb..bd394124d9b2 100644
--- a/java/java-impl/src/com/intellij/externalSystem/JavaProjectDataService.java
+++ b/java/java-impl/src/com/intellij/externalSystem/JavaProjectDataService.java
@@ -18,6 +18,7 @@ package com.intellij.externalSystem;
import com.intellij.openapi.externalSystem.model.DataNode;
import com.intellij.openapi.externalSystem.model.Key;
import com.intellij.openapi.externalSystem.service.project.manage.ProjectDataService;
+import com.intellij.openapi.externalSystem.util.DisposeAwareProjectChange;
import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.JavaSdk;
@@ -105,9 +106,9 @@ public class JavaProjectDataService implements ProjectDataService<JavaProjectDat
if (languageLevelExtension.getLanguageLevel().isAtLeast(languageLevel)) {
return;
}
- ExternalSystemApiUtil.executeProjectChangeAction(synchronous, new Runnable() {
+ ExternalSystemApiUtil.executeProjectChangeAction(synchronous, new DisposeAwareProjectChange(project) {
@Override
- public void run() {
+ public void execute() {
languageLevelExtension.setLanguageLevel(languageLevel);
}
});
diff --git a/java/java-impl/src/com/intellij/ide/hierarchy/call/CallHierarchyNodeDescriptor.java b/java/java-impl/src/com/intellij/ide/hierarchy/call/CallHierarchyNodeDescriptor.java
index 4dacb84d0469..4eb3a33b83e9 100644
--- a/java/java-impl/src/com/intellij/ide/hierarchy/call/CallHierarchyNodeDescriptor.java
+++ b/java/java-impl/src/com/intellij/ide/hierarchy/call/CallHierarchyNodeDescriptor.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2013 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -34,12 +34,8 @@ import com.intellij.openapi.util.TextRange;
import com.intellij.pom.Navigatable;
import com.intellij.psi.*;
import com.intellij.psi.presentation.java.ClassPresentationUtil;
-import com.intellij.psi.util.PsiFormatUtil;
-import com.intellij.psi.util.PsiTreeUtil;
-import com.intellij.psi.util.PsiUtilBase;
-import com.intellij.psi.util.PsiUtilCore;
+import com.intellij.psi.util.*;
import com.intellij.ui.LayeredIcon;
-import com.intellij.psi.util.FileTypeUtils;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
@@ -68,7 +64,7 @@ public final class CallHierarchyNodeDescriptor extends HierarchyNodeDescriptor i
return myElement == null ? null : getEnclosingElement(myElement);
}
- static PsiMember getEnclosingElement(final PsiElement element){
+ public static PsiMember getEnclosingElement(final PsiElement element){
return PsiTreeUtil.getNonStrictParentOfType(element, PsiMethod.class, PsiClass.class);
}
@@ -138,8 +134,8 @@ public final class CallHierarchyNodeDescriptor extends HierarchyNodeDescriptor i
}
final String methodText = PsiFormatUtil.formatMethod(
method,
- PsiSubstitutor.EMPTY, PsiFormatUtil.SHOW_NAME | PsiFormatUtil.SHOW_PARAMETERS,
- PsiFormatUtil.SHOW_TYPE
+ PsiSubstitutor.EMPTY, PsiFormatUtilBase.SHOW_NAME | PsiFormatUtilBase.SHOW_PARAMETERS,
+ PsiFormatUtilBase.SHOW_TYPE
);
buffer.append(methodText);
diff --git a/java/java-impl/src/com/intellij/ide/hierarchy/call/CallerMethodsTreeStructure.java b/java/java-impl/src/com/intellij/ide/hierarchy/call/CallerMethodsTreeStructure.java
index 5699d335c28e..45363bbef95f 100644
--- a/java/java-impl/src/com/intellij/ide/hierarchy/call/CallerMethodsTreeStructure.java
+++ b/java/java-impl/src/com/intellij/ide/hierarchy/call/CallerMethodsTreeStructure.java
@@ -17,12 +17,11 @@ package com.intellij.ide.hierarchy.call;
import com.intellij.ide.hierarchy.HierarchyNodeDescriptor;
import com.intellij.ide.hierarchy.HierarchyTreeStructure;
+import com.intellij.ide.util.treeView.NodeDescriptor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.search.SearchScope;
import com.intellij.psi.search.searches.MethodReferencesSearch;
-import com.intellij.psi.util.PsiUtil;
-import com.intellij.psi.util.TypeConversionUtil;
import com.intellij.util.ArrayUtil;
import com.intellij.util.Processor;
import com.intellij.util.containers.ContainerUtil;
@@ -63,69 +62,15 @@ public final class CallerMethodsTreeStructure extends HierarchyTreeStructure {
methodsToFind.add(method);
ContainerUtil.addAll(methodsToFind, method.findDeepestSuperMethods());
- final Map<PsiMember, CallHierarchyNodeDescriptor> methodToDescriptorMap = new HashMap<PsiMember, CallHierarchyNodeDescriptor>();
+ final Map<PsiMember, NodeDescriptor> methodToDescriptorMap = new HashMap<PsiMember, NodeDescriptor>();
for (final PsiMethod methodToFind : methodsToFind) {
+ final JavaCallHierarchyData data = new JavaCallHierarchyData(originalClass, methodToFind, originalType, method, methodsToFind, descriptor, methodToDescriptorMap, myProject);
+
MethodReferencesSearch.search(methodToFind, searchScope, true).forEach(new Processor<PsiReference>() {
@Override
public boolean process(final PsiReference reference) {
- if (reference instanceof PsiReferenceExpression) {
- final PsiExpression qualifier = ((PsiReferenceExpression)reference).getQualifierExpression();
- if (qualifier instanceof PsiSuperExpression) { // filter super.foo() call inside foo() and similar cases (bug 8411)
- final PsiClass superClass = PsiUtil.resolveClassInType(qualifier.getType());
- if (originalClass.isInheritor(superClass, true)) {
- return true;
- }
- }
- if (qualifier != null && !methodToFind.hasModifierProperty(PsiModifier.STATIC)) {
- final PsiType qualifierType = qualifier.getType();
- if (qualifierType instanceof PsiClassType &&
- !TypeConversionUtil.isAssignable(qualifierType, originalType) &&
- methodToFind != method) {
- final PsiClass psiClass = ((PsiClassType)qualifierType).resolve();
- if (psiClass != null) {
- final PsiMethod callee = psiClass.findMethodBySignature(methodToFind, true);
- if (callee != null && !methodsToFind.contains(callee)) {
- // skip sibling methods
- return true;
- }
- }
- }
- }
- }
- else {
- if (!(reference instanceof PsiElement)) {
- return true;
- }
-
- final PsiElement parent = ((PsiElement)reference).getParent();
- if (parent instanceof PsiNewExpression) {
- if (((PsiNewExpression)parent).getClassReference() != reference) {
- return true;
- }
- }
- else if (parent instanceof PsiAnonymousClass) {
- if (((PsiAnonymousClass)parent).getBaseClassReference() != reference) {
- return true;
- }
- }
- else {
- return true;
- }
- }
-
- final PsiElement element = reference.getElement();
- final PsiMember key = CallHierarchyNodeDescriptor.getEnclosingElement(element);
-
- synchronized (methodToDescriptorMap) {
- CallHierarchyNodeDescriptor d = methodToDescriptorMap.get(key);
- if (d == null) {
- d = new CallHierarchyNodeDescriptor(myProject, descriptor, element, false, true);
- methodToDescriptorMap.put(key, d);
- }
- else if (!d.hasReference(reference)) {
- d.incrementUsageCount();
- }
- d.addReference(reference);
+ for (CallReferenceProcessor processor : CallReferenceProcessor.EP_NAME.getExtensions()) {
+ if (!processor.process(reference, data)) break;
}
return true;
}
diff --git a/java/java-impl/src/com/intellij/ide/hierarchy/call/JavaCallReferenceProcessor.java b/java/java-impl/src/com/intellij/ide/hierarchy/call/JavaCallReferenceProcessor.java
new file mode 100644
index 000000000000..e563ee64381f
--- /dev/null
+++ b/java/java-impl/src/com/intellij/ide/hierarchy/call/JavaCallReferenceProcessor.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2000-2013 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.ide.hierarchy.call;
+
+import com.intellij.ide.util.treeView.NodeDescriptor;
+import com.intellij.openapi.project.Project;
+import com.intellij.psi.*;
+import com.intellij.psi.util.PsiUtil;
+import com.intellij.psi.util.TypeConversionUtil;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Created by Max Medvedev on 10/5/13
+ */
+public class JavaCallReferenceProcessor implements CallReferenceProcessor {
+ @Override
+ public boolean process(@NotNull PsiReference reference, @NotNull JavaCallHierarchyData data) {
+ PsiClass originalClass = data.getOriginalClass();
+ PsiMethod method = data.getMethod();
+ Set<PsiMethod> methodsToFind = data.getMethodsToFind();
+ PsiMethod methodToFind = data.getMethodToFind();
+ PsiClassType originalType = data.getOriginalType();
+ Map<PsiMember, NodeDescriptor> methodToDescriptorMap = data.getResultMap();
+ Project myProject = data.getProject();
+
+ if (reference instanceof PsiReferenceExpression) {
+ final PsiExpression qualifier = ((PsiReferenceExpression)reference).getQualifierExpression();
+ if (qualifier instanceof PsiSuperExpression) { // filter super.foo() call inside foo() and similar cases (bug 8411)
+ final PsiClass superClass = PsiUtil.resolveClassInType(qualifier.getType());
+ if (superClass == null || originalClass.isInheritor(superClass, true)) {
+ return true;
+ }
+ }
+ if (qualifier != null && !methodToFind.hasModifierProperty(PsiModifier.STATIC)) {
+ final PsiType qualifierType = qualifier.getType();
+ if (qualifierType instanceof PsiClassType &&
+ !TypeConversionUtil.isAssignable(qualifierType, originalType) &&
+ methodToFind != method) {
+ final PsiClass psiClass = ((PsiClassType)qualifierType).resolve();
+ if (psiClass != null) {
+ final PsiMethod callee = psiClass.findMethodBySignature(methodToFind, true);
+ if (callee != null && !methodsToFind.contains(callee)) {
+ // skip sibling methods
+ return true;
+ }
+ }
+ }
+ }
+ }
+ else {
+ if (!(reference instanceof PsiElement)) {
+ return true;
+ }
+
+ final PsiElement parent = ((PsiElement)reference).getParent();
+ if (parent instanceof PsiNewExpression) {
+ if (((PsiNewExpression)parent).getClassReference() != reference) {
+ return true;
+ }
+ }
+ else if (parent instanceof PsiAnonymousClass) {
+ if (((PsiAnonymousClass)parent).getBaseClassReference() != reference) {
+ return true;
+ }
+ }
+ else {
+ return true;
+ }
+ }
+
+ final PsiElement element = reference.getElement();
+ final PsiMember key = CallHierarchyNodeDescriptor.getEnclosingElement(element);
+
+ synchronized (methodToDescriptorMap) {
+ CallHierarchyNodeDescriptor d = (CallHierarchyNodeDescriptor)methodToDescriptorMap.get(key);
+ if (d == null) {
+ d = new CallHierarchyNodeDescriptor(myProject, (CallHierarchyNodeDescriptor)data.getNodeDescriptor(), element, false, true);
+ methodToDescriptorMap.put(key, d);
+ }
+ else if (!d.hasReference(reference)) {
+ d.incrementUsageCount();
+ }
+ d.addReference(reference);
+ }
+ return false;
+ }
+}
diff --git a/java/java-impl/src/com/intellij/ide/projectView/actions/MarkGeneratedSourceRootAction.java b/java/java-impl/src/com/intellij/ide/projectView/actions/MarkGeneratedSourceRootAction.java
new file mode 100644
index 000000000000..e56a43233581
--- /dev/null
+++ b/java/java-impl/src/com/intellij/ide/projectView/actions/MarkGeneratedSourceRootAction.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2000-2013 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.ide.projectView.actions;
+
+import com.intellij.icons.AllIcons;
+import com.intellij.openapi.actionSystem.Presentation;
+import com.intellij.openapi.module.JavaModuleType;
+import com.intellij.openapi.module.Module;
+import com.intellij.openapi.module.ModuleType;
+import com.intellij.openapi.roots.ContentEntry;
+import com.intellij.openapi.roots.SourceFolder;
+import com.intellij.openapi.vfs.VirtualFile;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes;
+import org.jetbrains.jps.model.java.JavaSourceRootProperties;
+import org.jetbrains.jps.model.java.JavaSourceRootType;
+import org.jetbrains.jps.model.java.JpsJavaExtensionService;
+
+/**
+ * @author nik
+ */
+public class MarkGeneratedSourceRootAction extends MarkRootActionBase {
+ public MarkGeneratedSourceRootAction() {
+ Presentation presentation = getTemplatePresentation();
+ presentation.setIcon(AllIcons.Modules.SourceRoot);
+ presentation.setText("Generated Sources Root");
+ presentation.setDescription("Mark directory as a source root for generated files");
+ }
+
+ @Override
+ protected boolean isEnabled(@NotNull RootsSelection selection, @NotNull Module module) {
+ if (!(ModuleType.get(module) instanceof JavaModuleType)) return false;
+
+ if (selection.myHaveSelectedFilesUnderSourceRoots) {
+ return false;
+ }
+
+ if (!selection.mySelectedDirectories.isEmpty()) {
+ return true;
+ }
+
+ for (SourceFolder root : selection.mySelectedRoots) {
+ JavaSourceRootProperties properties = root.getJpsElement().getProperties(JavaModuleSourceRootTypes.SOURCES);
+ if (properties != null && !properties.isForGeneratedSources()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ protected void modifyRoots(VirtualFile vFile, ContentEntry entry) {
+ JavaSourceRootProperties properties = JpsJavaExtensionService.getInstance().createSourceRootProperties("", true);
+ entry.addSourceFolder(vFile, JavaSourceRootType.SOURCE, properties);
+ }
+}
diff --git a/java/java-impl/src/com/intellij/ide/projectView/actions/UnmarkGeneratedSourceRootAction.java b/java/java-impl/src/com/intellij/ide/projectView/actions/UnmarkGeneratedSourceRootAction.java
new file mode 100644
index 000000000000..0af8706ab38c
--- /dev/null
+++ b/java/java-impl/src/com/intellij/ide/projectView/actions/UnmarkGeneratedSourceRootAction.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2000-2013 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.ide.projectView.actions;
+
+import com.intellij.icons.AllIcons;
+import com.intellij.openapi.actionSystem.Presentation;
+import com.intellij.openapi.module.Module;
+import com.intellij.openapi.roots.ContentEntry;
+import com.intellij.openapi.roots.SourceFolder;
+import com.intellij.openapi.vfs.VirtualFile;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes;
+import org.jetbrains.jps.model.java.JavaSourceRootProperties;
+import org.jetbrains.jps.model.java.JavaSourceRootType;
+
+/**
+ * @author nik
+ */
+public class UnmarkGeneratedSourceRootAction extends MarkRootActionBase {
+ public UnmarkGeneratedSourceRootAction() {
+ Presentation presentation = getTemplatePresentation();
+ presentation.setIcon(AllIcons.Modules.SourceRoot);
+ presentation.setText("Unmark Generated Sources Root");
+ presentation.setDescription("Mark directory as an ordinary source root");
+ }
+
+ @Override
+ protected boolean isEnabled(@NotNull RootsSelection selection, @NotNull Module module) {
+ for (SourceFolder root : selection.mySelectedRoots) {
+ JavaSourceRootProperties properties = root.getJpsElement().getProperties(JavaModuleSourceRootTypes.SOURCES);
+ if (properties != null && properties.isForGeneratedSources()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ protected void modifyRoots(VirtualFile vFile, ContentEntry entry) {
+ entry.addSourceFolder(vFile, JavaSourceRootType.SOURCE);
+ }
+}
diff --git a/java/java-impl/src/com/intellij/javadoc/JavadocConfiguration.java b/java/java-impl/src/com/intellij/javadoc/JavadocConfiguration.java
index bf58e0f2253b..fe598e3e8d7f 100644
--- a/java/java-impl/src/com/intellij/javadoc/JavadocConfiguration.java
+++ b/java/java-impl/src/com/intellij/javadoc/JavadocConfiguration.java
@@ -30,6 +30,7 @@ import com.intellij.ide.BrowserUtil;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleUtil;
+import com.intellij.openapi.module.ModuleUtilCore;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.JavaSdk;
@@ -57,6 +58,7 @@ import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collection;
import java.util.List;
+import java.util.Set;
/**
* @author Eugene Zhuravlev
@@ -228,13 +230,24 @@ public class JavadocConfiguration implements ModuleRunProfile, JDOMExternalizabl
parameters.addParametersString(OTHER_OPTIONS);
+ final Set<Module> modules = new HashSet<Module>();
+ myGenerationOptions.accept(new PsiRecursiveElementWalkingVisitor() {
+ @Override
+ public void visitFile(PsiFile file) {
+ final Module module = ModuleUtilCore.findModuleForPsiElement(file);
+ if (module != null) {
+ modules.add(module);
+ }
+ }
+ });
final PathsList classPath;
+ final OrderEnumerator orderEnumerator = ProjectRootManager.getInstance(myProject).orderEntries(modules);
if (jdk.getSdkType() instanceof JavaSdk) {
- classPath = OrderEnumerator.orderEntries(myProject).withoutSdk().withoutModuleSourceEntries().getPathsList();
+ classPath = orderEnumerator.withoutSdk().withoutModuleSourceEntries().getPathsList();
}
else {
//libraries are included into jdk
- classPath = OrderEnumerator.orderEntries(myProject).withoutModuleSourceEntries().getPathsList();
+ classPath = orderEnumerator.withoutModuleSourceEntries().getPathsList();
}
final String classPathString = classPath.getPathsString();
if (classPathString.length() > 0) {
diff --git a/java/java-impl/src/com/intellij/openapi/roots/JavaGeneratedSourcesFilter.java b/java/java-impl/src/com/intellij/openapi/roots/JavaGeneratedSourcesFilter.java
new file mode 100644
index 000000000000..89e121e0bd47
--- /dev/null
+++ b/java/java-impl/src/com/intellij/openapi/roots/JavaGeneratedSourcesFilter.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2000-2013 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.openapi.roots;
+
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.vfs.VirtualFile;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * @author nik
+ */
+public class JavaGeneratedSourcesFilter extends GeneratedSourcesFilter {
+ @Override
+ public boolean isGeneratedSource(@NotNull VirtualFile file, @NotNull Project project) {
+ return JavaProjectRootsUtil.isInGeneratedCode(file, project);
+ }
+}
diff --git a/java/java-impl/src/com/intellij/openapi/roots/JavaProjectRootsUtil.java b/java/java-impl/src/com/intellij/openapi/roots/JavaProjectRootsUtil.java
index 6a04def9469c..cecab4e02d2b 100644
--- a/java/java-impl/src/com/intellij/openapi/roots/JavaProjectRootsUtil.java
+++ b/java/java-impl/src/com/intellij/openapi/roots/JavaProjectRootsUtil.java
@@ -3,7 +3,6 @@ package com.intellij.openapi.roots;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.project.Project;
-import com.intellij.openapi.roots.impl.SourceFolderImpl;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiCodeFragment;
import com.intellij.psi.PsiFile;
@@ -39,8 +38,7 @@ public class JavaProjectRootsUtil {
for (Module module : ModuleManager.getInstance(project).getModules()) {
for (ContentEntry entry : ModuleRootManager.getInstance(module).getContentEntries()) {
for (SourceFolder sourceFolder : entry.getSourceFolders(JavaModuleSourceRootTypes.SOURCES)) {
- JavaSourceRootProperties properties = (JavaSourceRootProperties)((SourceFolderImpl)sourceFolder).getJpsElement().getProperties();
- if (!properties.isForGeneratedSources()) {
+ if (!isForGeneratedSources(sourceFolder)) {
ContainerUtil.addIfNotNull(roots, sourceFolder.getFile());
}
}
@@ -48,4 +46,27 @@ public class JavaProjectRootsUtil {
}
return roots;
}
+
+ private static boolean isForGeneratedSources(SourceFolder sourceFolder) {
+ JavaSourceRootProperties properties = sourceFolder.getJpsElement().getProperties(JavaModuleSourceRootTypes.SOURCES);
+ return properties != null && properties.isForGeneratedSources();
+ }
+
+ public static boolean isInGeneratedCode(@NotNull VirtualFile file, @NotNull Project project) {
+ ProjectFileIndex fileIndex = ProjectRootManager.getInstance(project).getFileIndex();
+ Module module = fileIndex.getModuleForFile(file);
+ if (module == null) return false;
+
+ VirtualFile sourceRoot = fileIndex.getSourceRootForFile(file);
+ if (sourceRoot == null) return false;
+
+ for (ContentEntry entry : ModuleRootManager.getInstance(module).getContentEntries()) {
+ for (SourceFolder folder : entry.getSourceFolders()) {
+ if (sourceRoot.equals(folder.getFile())) {
+ return isForGeneratedSources(folder);
+ }
+ }
+ }
+ return false;
+ }
}
diff --git a/java/java-impl/src/com/intellij/psi/impl/JavaPsiImplementationHelperImpl.java b/java/java-impl/src/com/intellij/psi/impl/JavaPsiImplementationHelperImpl.java
index d720a01eb987..ab6289584719 100644
--- a/java/java-impl/src/com/intellij/psi/impl/JavaPsiImplementationHelperImpl.java
+++ b/java/java-impl/src/com/intellij/psi/impl/JavaPsiImplementationHelperImpl.java
@@ -40,10 +40,12 @@ import com.intellij.psi.impl.source.codeStyle.ImportHelper;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.IncorrectOperationException;
+import com.intellij.util.containers.ContainerUtil;
import gnu.trove.THashSet;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import java.util.Collections;
import java.util.List;
import java.util.Properties;
import java.util.Set;
@@ -115,19 +117,22 @@ public class JavaPsiImplementationHelperImpl extends JavaPsiImplementationHelper
final VirtualFile vFile = clsFile.getContainingFile().getVirtualFile();
ProjectFileIndex projectFileIndex = ProjectFileIndex.SERVICE.getInstance(clsFile.getProject());
- final List<OrderEntry> orderEntries = projectFileIndex.getOrderEntriesForFile(vFile);
- for (OrderEntry orderEntry : orderEntries) {
- VirtualFile[] files = orderEntry.getFiles(OrderRootType.SOURCES);
- for (VirtualFile file : files) {
- VirtualFile source = file.findFileByRelativePath(relativeFilePath);
- if (source != null) {
- PsiFile psiSource = clsFile.getManager().findFile(source);
- if (psiSource instanceof PsiClassOwner) {
- return psiSource;
- }
+ final Set<VirtualFile> sourceRoots = ContainerUtil.newLinkedHashSet();
+ for (OrderEntry orderEntry : projectFileIndex.getOrderEntriesForFile(vFile)) {
+ if (orderEntry instanceof LibraryOrSdkOrderEntry) {
+ Collections.addAll(sourceRoots, orderEntry.getFiles(OrderRootType.SOURCES));
+ }
+ }
+ for (VirtualFile root : sourceRoots) {
+ VirtualFile source = root.findFileByRelativePath(relativeFilePath);
+ if (source != null) {
+ PsiFile psiSource = clsFile.getManager().findFile(source);
+ if (psiSource instanceof PsiClassOwner) {
+ return psiSource;
}
}
}
+
return clsFile;
}
diff --git a/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/JavaReferenceAdjuster.java b/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/JavaReferenceAdjuster.java
index 446a6a2b4aa0..c06976774177 100644
--- a/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/JavaReferenceAdjuster.java
+++ b/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/JavaReferenceAdjuster.java
@@ -133,8 +133,13 @@ public class JavaReferenceAdjuster implements ReferenceAdjuster {
PsiJavaCodeReferenceElement ref = (PsiJavaCodeReferenceElement)element.getPsi();
PsiElement qualifier = ref.getQualifier();
- if (qualifier instanceof PsiJavaCodeReferenceElement && PsiTreeUtil.getChildOfType(qualifier, PsiAnnotation.class) != null) {
- return true;
+ if (qualifier instanceof PsiJavaCodeReferenceElement) {
+ if (((PsiJavaCodeReferenceElement)qualifier).resolve() instanceof PsiPackage) {
+ return false;
+ }
+ if (PsiTreeUtil.getChildOfType(qualifier, PsiAnnotation.class) != null) {
+ return true;
+ }
}
PsiModifierList modifierList = PsiImplUtil.findNeighbourModifierList(ref);
diff --git a/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java b/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java
index 271e83238b2f..4ec3a1397111 100644
--- a/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java
+++ b/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java
@@ -954,6 +954,7 @@ public abstract class IntroduceVariableBase extends IntroduceHandlerBase {
final PsiElement parent = expr1.getUserData(ElementToWorkOn.PARENT);
final RangeMarker rangeMarker = expr1.getUserData(ElementToWorkOn.TEXT_RANGE);
+ LOG.assertTrue(parent != null, expr1);
return parent.replace(createReplacement(ref.getText(), project, prefix, suffix, parent, rangeMarker, new int[1]));
}
}
diff --git a/java/java-impl/src/com/intellij/refactoring/invertBoolean/InvertBooleanHandler.java b/java/java-impl/src/com/intellij/refactoring/invertBoolean/InvertBooleanHandler.java
index 3cc473aa8021..be8cab8538bf 100644
--- a/java/java-impl/src/com/intellij/refactoring/invertBoolean/InvertBooleanHandler.java
+++ b/java/java-impl/src/com/intellij/refactoring/invertBoolean/InvertBooleanHandler.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2013 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,7 +18,6 @@ package com.intellij.refactoring.invertBoolean;
import com.intellij.ide.util.SuperMethodWarningUtil;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.actionSystem.DataContext;
-import com.intellij.openapi.actionSystem.LangDataKeys;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.ScrollType;
import com.intellij.openapi.project.Project;
@@ -70,8 +69,13 @@ public class InvertBooleanHandler implements RefactoringActionHandler {
}
public void invoke(@NotNull Project project, @NotNull PsiElement[] elements, @NotNull DataContext dataContext) {
- if (elements.length == 1 && elements[0] instanceof PsiMethod) {
- invoke((PsiMethod)elements[0], project, null);
+ if (elements.length == 1) {
+ if (elements[0] instanceof PsiMethod) {
+ invoke((PsiMethod)elements[0], project, null);
+ }
+ else if (elements[0] instanceof PsiVariable) {
+ invoke((PsiVariable)elements[0], project, null);
+ }
}
}
diff --git a/java/java-impl/src/com/intellij/slicer/SliceForwardUtil.java b/java/java-impl/src/com/intellij/slicer/SliceForwardUtil.java
index 7374d1136c95..254498e5674d 100644
--- a/java/java-impl/src/com/intellij/slicer/SliceForwardUtil.java
+++ b/java/java-impl/src/com/intellij/slicer/SliceForwardUtil.java
@@ -23,7 +23,7 @@ import com.intellij.psi.search.searches.OverridingMethodsSearch;
import com.intellij.psi.search.searches.ReferencesSearch;
import com.intellij.psi.util.MethodSignatureUtil;
import com.intellij.psi.util.PsiTreeUtil;
-import com.intellij.util.ArrayUtil;
+import com.intellij.util.ArrayUtilRt;
import com.intellij.util.Processor;
import gnu.trove.THashSet;
import org.jetbrains.annotations.NotNull;
@@ -242,7 +242,7 @@ public class SliceForwardUtil {
//method call
else if (parent instanceof PsiExpressionList && parent.getParent() instanceof PsiCallExpression) {
PsiExpression[] expressions = ((PsiExpressionList)parent).getExpressions();
- int index = ArrayUtil.find(expressions, element);
+ int index = ArrayUtilRt.find(expressions, element);
PsiCallExpression methodCall = (PsiCallExpression)parent.getParent();
JavaResolveResult result = methodCall.resolveMethodGenerics();
PsiMethod method = (PsiMethod)result.getElement();
diff --git a/java/java-impl/src/com/intellij/spi/psi/SPIClassProviderReferenceElement.java b/java/java-impl/src/com/intellij/spi/psi/SPIClassProviderReferenceElement.java
index 7d9fc0218be5..1563adae7bc5 100644
--- a/java/java-impl/src/com/intellij/spi/psi/SPIClassProviderReferenceElement.java
+++ b/java/java-impl/src/com/intellij/spi/psi/SPIClassProviderReferenceElement.java
@@ -45,11 +45,13 @@ public class SPIClassProviderReferenceElement extends SPIPackageOrClassReference
ClassInheritorsSearch.search(superProvider).forEach(new Processor<PsiClass>() {
@Override
public boolean process(PsiClass psiClass) {
- final String jvmClassName = ClassUtil.getJVMClassName(psiClass);
- if (jvmClassName != null) {
- result.add(LookupElementBuilder.create(psiClass, jvmClassName));
+ if (!psiClass.hasModifierProperty(PsiModifier.ABSTRACT)) {
+ final String jvmClassName = ClassUtil.getJVMClassName(psiClass);
+ if (jvmClassName != null) {
+ result.add(LookupElementBuilder.create(psiClass, jvmClassName));
+ }
}
- return false;
+ return true;
}
});
return ArrayUtil.toObjectArray(result);
diff --git a/java/java-impl/src/com/intellij/usageView/UsageContextDataflowToPanel.java b/java/java-impl/src/com/intellij/usageView/UsageContextDataflowToPanel.java
index b097a8a7e307..de31282b0cca 100644
--- a/java/java-impl/src/com/intellij/usageView/UsageContextDataflowToPanel.java
+++ b/java/java-impl/src/com/intellij/usageView/UsageContextDataflowToPanel.java
@@ -84,7 +84,7 @@ public class UsageContextDataflowToPanel extends UsageContextPanelBase {
public void updateLayoutLater(@Nullable final List<UsageInfo> infos) {
if (infos == null) {
removeAll();
- JComponent titleComp = new JLabel(UsageViewBundle.message("select.the.usage.to.preview"));
+ JComponent titleComp = new JLabel(UsageViewBundle.message("select.the.usage.to.preview"), SwingConstants.CENTER);
add(titleComp, BorderLayout.CENTER);
revalidate();
}
diff --git a/java/java-impl/src/com/intellij/usages/impl/rules/PackageGroupingRule.java b/java/java-impl/src/com/intellij/usages/impl/rules/PackageGroupingRule.java
index 960e6180a7c7..86f57a463893 100644
--- a/java/java-impl/src/com/intellij/usages/impl/rules/PackageGroupingRule.java
+++ b/java/java-impl/src/com/intellij/usages/impl/rules/PackageGroupingRule.java
@@ -27,6 +27,7 @@ import com.intellij.psi.JavaDirectoryService;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiManager;
import com.intellij.psi.PsiPackage;
+import com.intellij.usageView.UsageViewBundle;
import com.intellij.usages.UsageGroup;
import com.intellij.usages.UsageView;
import org.jetbrains.annotations.NotNull;
@@ -51,6 +52,11 @@ public class PackageGroupingRule extends DirectoryGroupingRule {
return super.getGroupForFile(dir);
}
+ @Override
+ public String getActionTitle() {
+ return UsageViewBundle.message("action.group.by.package");
+ }
+
private class PackageGroup implements UsageGroup, TypeSafeDataProvider {
private final PsiPackage myPackage;
private Icon myIcon;
diff --git a/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java b/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java
index 5ef2b8fe2ead..d8cdf4758148 100644
--- a/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java
+++ b/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java
@@ -270,16 +270,13 @@ public class GenericsUtil {
continue;
}
final PsiType extendsBound = ((PsiWildcardType)substituted).getExtendsBound();
- if (Comparing.equal(TypeConversionUtil.erasure(extendsType), TypeConversionUtil.erasure(extendsBound))) {
- if (extendsBound instanceof PsiClassType) {
- if (acceptExtendsBound((PsiClassType)extendsBound, 0)) continue;
- } else if (extendsBound instanceof PsiIntersectionType) {
- for (PsiType psiType : ((PsiIntersectionType)extendsBound).getConjuncts()) {
- if (psiType instanceof PsiClassType) {
- if (acceptExtendsBound((PsiClassType)psiType, 0)) continue nextTypeParam;
- }
- }
- }
+ if (acceptExtendsBound(extendsType, extendsBound)) {
+ continue nextTypeParam;
+ }
+ }
+ else if (substituted instanceof PsiIntersectionType) {
+ for (PsiType extendsBound : ((PsiIntersectionType)substituted).getConjuncts()) {
+ if (acceptExtendsBound(extendsType, extendsBound)) continue nextTypeParam;
}
}
if (extendsType != null && !TypeConversionUtil.isAssignable(extendsType, substituted, allowUncheckedConversion)) {
@@ -290,6 +287,22 @@ public class GenericsUtil {
return null;
}
+ public static boolean acceptExtendsBound(PsiType extendsType, PsiType extendsBound) {
+ if (Comparing.equal(TypeConversionUtil.erasure(extendsType), TypeConversionUtil.erasure(extendsBound))) {
+ if (extendsBound instanceof PsiClassType) {
+ if (acceptExtendsBound((PsiClassType)extendsBound, 0)) return true;
+ }
+ else if (extendsBound instanceof PsiIntersectionType) {
+ for (PsiType psiType : ((PsiIntersectionType)extendsBound).getConjuncts()) {
+ if (psiType instanceof PsiClassType) {
+ if (acceptExtendsBound((PsiClassType)psiType, 0)) return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
private static boolean acceptExtendsBound(PsiClassType extendsBound, int depth) {
PsiType[] parameters = extendsBound.getParameters();
if (parameters.length == 1) {
@@ -303,6 +316,13 @@ public class GenericsUtil {
if (bound instanceof PsiClassType && TypeConversionUtil.erasure(bound).equals(TypeConversionUtil.erasure(extendsBound))) {
return acceptExtendsBound((PsiClassType)bound, depth + 1);
}
+ if (bound instanceof PsiIntersectionType) {
+ for (PsiType extendsType : ((PsiIntersectionType)bound).getConjuncts()) {
+ if (acceptExtendsBound(extendsBound, extendsType)) {
+ return true;
+ }
+ }
+ }
}
}
return false;
diff --git a/java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceUtil.java b/java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceUtil.java
index 9bbb84e83020..f5f0bf96d95b 100644
--- a/java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceUtil.java
+++ b/java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceUtil.java
@@ -18,6 +18,7 @@ package com.intellij.psi;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.pom.java.LanguageLevel;
+import com.intellij.psi.infos.MethodCandidateInfo;
import com.intellij.psi.util.*;
import com.intellij.util.Function;
import com.sun.tools.javac.code.Kinds;
@@ -163,6 +164,10 @@ public class PsiMethodReferenceUtil {
public static boolean isAcceptable(@Nullable final PsiMethodReferenceExpression methodReferenceExpression, PsiType left) {
if (methodReferenceExpression == null) return false;
+ final PsiElement argsList = PsiTreeUtil.getParentOfType(methodReferenceExpression, PsiExpressionList.class);
+ if (MethodCandidateInfo.ourOverloadGuard.currentStack().contains(argsList)) {
+ if (!methodReferenceExpression.isExact()) return true;
+ }
if (left instanceof PsiIntersectionType) {
for (PsiType conjunct : ((PsiIntersectionType)left).getConjuncts()) {
if (isAcceptable(methodReferenceExpression, conjunct)) return true;
diff --git a/java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java b/java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java
index 3a0bfddaf36f..8e4a13026514 100644
--- a/java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java
+++ b/java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java
@@ -18,8 +18,10 @@ package com.intellij.psi.infos;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.JavaSdkVersion;
import com.intellij.openapi.projectRoots.JavaVersionService;
+import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.RecursionGuard;
+import com.intellij.openapi.util.RecursionManager;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.*;
@@ -37,6 +39,7 @@ import java.util.Map;
* @author ik, dsl
*/
public class MethodCandidateInfo extends CandidateInfo{
+ public static final RecursionGuard ourOverloadGuard = RecursionManager.createGuard("overload.guard");
public static final ThreadLocal<Map<PsiElement, Pair<PsiMethod, PsiSubstitutor>>> CURRENT_CANDIDATE = new ThreadLocal<Map<PsiElement, Pair<PsiMethod, PsiSubstitutor>>>();
@ApplicabilityLevelConstant private int myApplicabilityLevel = 0;
private final PsiElement myArgumentList;
@@ -95,6 +98,20 @@ public class MethodCandidateInfo extends CandidateInfo{
return myApplicabilityLevel;
}
+ @ApplicabilityLevelConstant
+ public int getPertinentApplicabilityLevel() {
+ final PsiMethod method = getElement();
+ if (method != null && method.hasTypeParameters() || myArgumentList == null || !PsiUtil.isLanguageLevel8OrHigher(myArgumentList)) {
+ return getApplicabilityLevel();
+ }
+ return ourOverloadGuard.doPreventingRecursion(myArgumentList, false, new Computable<Integer>() {
+ @Override
+ public Integer compute() {
+ return getApplicabilityLevelInner();
+ }
+ });
+ }
+
public PsiSubstitutor getSiteSubstitutor() {
return super.getSubstitutor();
}
diff --git a/java/java-psi-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java b/java/java-psi-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java
index ea5a668221af..4a99129c3d88 100644
--- a/java/java-psi-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java
+++ b/java/java-psi-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java
@@ -409,7 +409,8 @@ public class JavaDocInfoGenerator {
private static PsiDocComment getDocComment(final PsiDocCommentOwner docOwner) {
PsiElement navElement = docOwner.getNavigationElement();
if (!(navElement instanceof PsiDocCommentOwner)) {
- throw new AssertionError("Wrong navElement: " + navElement + "; original = " + docOwner + " of class " + docOwner.getClass());
+ LOG.info("Wrong navElement: " + navElement + "; original = " + docOwner + " of class " + docOwner.getClass());
+ return null;
}
PsiDocComment comment = ((PsiDocCommentOwner)navElement).getDocComment();
if (comment == null) { //check for non-normalized fields
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/PsiElementFactoryImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/PsiElementFactoryImpl.java
index 5b659f0f4631..e87fbe3cccbf 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/PsiElementFactoryImpl.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/PsiElementFactoryImpl.java
@@ -49,7 +49,6 @@ public class PsiElementFactoryImpl extends PsiJavaParserFacadeImpl implements Ps
private PsiClass myArrayClass15;
private final ConcurrentHashMap<GlobalSearchScope, PsiClassType> myCachedObjectType = new ConcurrentHashMap<GlobalSearchScope, PsiClassType>();
-
public PsiElementFactoryImpl(final PsiManagerEx manager) {
super(manager);
manager.registerRunnableToRunOnChange(new Runnable() {
@@ -66,14 +65,14 @@ public class PsiElementFactoryImpl extends PsiJavaParserFacadeImpl implements Ps
if (!languageLevel.isAtLeast(LanguageLevel.JDK_1_5)) {
if (myArrayClass == null) {
@NonNls final String body = "public class __Array__{\n public final int length;\n public Object clone() {}\n}";
- myArrayClass = createClassFromText(body, null).getInnerClasses()[0];
+ myArrayClass = ((PsiExtensibleClass)createClassFromText(body, null)).getOwnInnerClasses().get(0);
}
return myArrayClass;
}
else {
if (myArrayClass15 == null) {
@NonNls final String body = "public class __Array__<T>{\n public final int length;\n public T[] clone() {}\n}";
- myArrayClass15 = createClassFromText(body, null).getInnerClasses()[0];
+ myArrayClass15 = ((PsiExtensibleClass)createClassFromText(body, null)).getOwnInnerClasses().get(0);
}
return myArrayClass15;
}
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/PsiImplUtil.java b/java/java-psi-impl/src/com/intellij/psi/impl/PsiImplUtil.java
index 365c5e66d6c1..48c9d63aa059 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/PsiImplUtil.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/PsiImplUtil.java
@@ -345,7 +345,6 @@ public class PsiImplUtil {
if (annotationType instanceof PsiClass) {
return findApplicableTarget((PsiClass)annotationType, types);
}
- if (annotationType == null) return null;
}
}
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/ProcessCandidateParameterTypeInferencePolicy.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/ProcessCandidateParameterTypeInferencePolicy.java
index e88fca2a3025..96b6f4b19271 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/ProcessCandidateParameterTypeInferencePolicy.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/ProcessCandidateParameterTypeInferencePolicy.java
@@ -109,10 +109,9 @@ public class ProcessCandidateParameterTypeInferencePolicy extends DefaultParamet
return substitutor.substitute(finalParameter.getType());
}
});
- PsiResolveHelperImpl resolveHelper = (PsiResolveHelperImpl)JavaPsiFacade.getInstance(method.getProject()).getResolveHelper();
final LanguageLevel languageLevel = PsiUtil.getLanguageLevel(finalParameter);
final Pair<PsiType, ConstraintType> constraint =
- ((PsiOldInferenceHelper)resolveHelper.getInferenceHelper(languageLevel)).getSubstitutionForTypeParameterConstraint(typeParameter, innerReturnType, type, false, languageLevel);
+ new PsiOldInferenceHelper(element.getManager()).getSubstitutionForTypeParameterConstraint(typeParameter, innerReturnType, type, false, languageLevel);
if (constraint != null) return constraint;
}
}
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java
index 27a949b84495..76fc67ddce68 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java
@@ -28,7 +28,6 @@ import com.intellij.util.ArrayUtilRt;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-import java.io.Serializable;
import java.util.*;
/**
@@ -70,16 +69,15 @@ public class InferenceSession {
}
public InferenceSession(PsiTypeParameter[] typeParams,
- PsiParameter[] parameters,
- PsiExpression[] args,
PsiSubstitutor siteSubstitutor,
- PsiElement parent,
PsiManager manager) {
myManager = manager;
mySiteSubstitutor = siteSubstitutor;
initBounds(typeParams);
+ }
+ public void initExpressionConstraints(PsiParameter[] parameters, PsiExpression[] args, PsiElement parent) {
final Pair<PsiMethod, PsiCallExpression> pair = getPair(parent);
if (parameters.length > 0) {
for (int i = 0; i < args.length; i++) {
@@ -274,32 +272,7 @@ public class InferenceSession {
if (!PsiType.VOID.equals(returnType) && returnType != null) {
PsiType targetType = PsiTypesUtil.getExpectedTypeByParent(context);
if (targetType == null) {
- final PsiElement parent = PsiUtil.skipParenthesizedExprUp(context.getParent());
- if (parent instanceof PsiExpressionList) {
- final PsiElement gParent = parent.getParent();
- if (gParent instanceof PsiCallExpression) {
- final PsiExpressionList argumentList = ((PsiCallExpression)gParent).getArgumentList();
- if (argumentList != null) {
- final Pair<PsiMethod, PsiSubstitutor> pair = MethodCandidateInfo.getCurrentMethod(argumentList);
- final JavaResolveResult resolveResult = pair == null ? ((PsiCallExpression)gParent).resolveMethodGenerics() : null;
- final PsiElement parentMethod = pair != null ? pair.first : resolveResult.getElement();
- if (parentMethod instanceof PsiMethod) {
- final PsiParameter[] parameters = ((PsiMethod)parentMethod).getParameterList().getParameters();
- PsiElement arg = context;
- while (arg.getParent() instanceof PsiParenthesizedExpression) {
- arg = parent.getParent();
- }
- final PsiExpression[] args = argumentList.getExpressions();
- targetType = getParameterType(parameters, args, ArrayUtilRt.find(args, arg), pair != null ? pair.second : resolveResult.getSubstitutor());
- }
- }
- }
- } else if (parent instanceof PsiConditionalExpression) {
- targetType = PsiTypesUtil.getExpectedTypeByParent((PsiExpression)parent);
- }
- else if (parent instanceof PsiLambdaExpression) {
- targetType = LambdaUtil.getFunctionalInterfaceReturnType(((PsiLambdaExpression)parent).getFunctionalInterfaceType());
- }
+ targetType = getTargetType(context);
}
if (targetType != null) {
myConstraints.add(new TypeCompatibilityConstraint(GenericsUtil.eliminateWildcards(targetType, false), PsiImplUtil.normalizeWildcardTypeByPosition(returnType, context)));
@@ -308,6 +281,43 @@ public class InferenceSession {
}
}
+ private static PsiType getTargetType(PsiExpression context) {
+ final PsiElement parent = PsiUtil.skipParenthesizedExprUp(context.getParent());
+ if (parent instanceof PsiExpressionList) {
+ final PsiElement gParent = parent.getParent();
+ if (gParent instanceof PsiCallExpression) {
+ final PsiExpressionList argumentList = ((PsiCallExpression)gParent).getArgumentList();
+ if (argumentList != null) {
+ final Pair<PsiMethod, PsiSubstitutor> pair = MethodCandidateInfo.getCurrentMethod(argumentList);
+ final JavaResolveResult resolveResult = pair == null ? ((PsiCallExpression)gParent).resolveMethodGenerics() : null;
+ final PsiElement parentMethod = pair != null ? pair.first : resolveResult.getElement();
+ if (parentMethod instanceof PsiMethod) {
+ final PsiParameter[] parameters = ((PsiMethod)parentMethod).getParameterList().getParameters();
+ if (parameters.length == 0) return null;
+ PsiElement arg = context;
+ while (arg.getParent() instanceof PsiParenthesizedExpression) {
+ arg = arg.getParent();
+ }
+ final PsiExpression[] args = argumentList.getExpressions();
+ final int i = ArrayUtilRt.find(args, arg);
+ if (i < 0) return null;
+ return getParameterType(parameters, args, i, pair != null ? pair.second : resolveResult.getSubstitutor());
+ }
+ }
+ }
+ } else if (parent instanceof PsiConditionalExpression) {
+ PsiType targetType = PsiTypesUtil.getExpectedTypeByParent((PsiExpression)parent);
+ if (targetType == null) {
+ targetType = getTargetType((PsiExpression)parent);
+ }
+ return targetType;
+ }
+ else if (parent instanceof PsiLambdaExpression) {
+ return LambdaUtil.getFunctionalInterfaceReturnType(((PsiLambdaExpression)parent).getFunctionalInterfaceType());
+ }
+ return null;
+ }
+
public InferenceVariable getInferenceVariable(PsiType psiType) {
return getInferenceVariable(psiType, true);
}
@@ -419,16 +429,17 @@ public class InferenceSession {
inferenceVariable.setInstantiation(null);
continue;
}
- PsiType bound = null;
- for (PsiType eqBound : eqBounds) {
- if (eqBound == null) continue;
- if (bound != null && !isProperType(eqBound)) continue;
- bound = acceptBoundsWithRecursiveDependencies(typeParameter, eqBound, substitutor);
+ if (eqBounds.size() > 1) {
+ for (Iterator<PsiType> iterator = eqBounds.iterator(); iterator.hasNext(); ) {
+ PsiType eqBound = iterator.next();
+ if (PsiUtil.resolveClassInType(eqBound) == typeParameter) {
+ iterator.remove();
+ }
+ }
+ if (eqBounds.size() > 1) continue;
}
+ PsiType bound = eqBounds.isEmpty() ? null : acceptBoundsWithRecursiveDependencies(typeParameter, eqBounds.get(0), substitutor);
if (bound != null) {
- if (bound instanceof PsiCapturedWildcardType && eqBounds.size() > 1) {
- continue;
- }
inferenceVariable.setInstantiation(bound);
} else {
PsiType lub = null;
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/PsiGraphInferenceHelper.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/PsiGraphInferenceHelper.java
index 84c8b7cef80f..ebec24e79108 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/PsiGraphInferenceHelper.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/PsiGraphInferenceHelper.java
@@ -38,8 +38,8 @@ public class PsiGraphInferenceHelper implements PsiInferenceHelper {
@NotNull PsiSubstitutor partialSubstitutor,
@Nullable PsiElement parent,
@NotNull ParameterTypeInferencePolicy policy) {
- final InferenceSession inferenceSession =
- new InferenceSession(new PsiTypeParameter[]{typeParameter}, parameters, arguments, partialSubstitutor, parent, myManager);
+ final InferenceSession inferenceSession = new InferenceSession(new PsiTypeParameter[]{typeParameter}, partialSubstitutor, myManager);
+ inferenceSession.initExpressionConstraints(parameters, arguments, parent);
return inferenceSession.infer(parameters, arguments, parent).substitute(typeParameter);
}
@@ -53,8 +53,8 @@ public class PsiGraphInferenceHelper implements PsiInferenceHelper {
@NotNull ParameterTypeInferencePolicy policy,
@NotNull LanguageLevel languageLevel) {
if (typeParameters.length == 0) return partialSubstitutor;
- final InferenceSession inferenceSession =
- new InferenceSession(typeParameters, parameters, arguments, partialSubstitutor, parent, myManager);
+ final InferenceSession inferenceSession = new InferenceSession(typeParameters, partialSubstitutor, myManager);
+ inferenceSession.initExpressionConstraints(parameters, arguments, parent);
return inferenceSession.infer(parameters, arguments, parent);
}
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/ExpressionCompatibilityConstraint.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/ExpressionCompatibilityConstraint.java
index 7ef2a7250030..830fad91d650 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/ExpressionCompatibilityConstraint.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/ExpressionCompatibilityConstraint.java
@@ -83,11 +83,9 @@ public class ExpressionCompatibilityConstraint extends InputOutputConstraintForm
InferenceSession callSession = null;
if (method != null && !method.isConstructor()) {
returnType = method.getReturnType();
- final PsiParameter[] parameters = method.getParameterList().getParameters();
if (returnType != null) {
- callSession = new InferenceSession(method.getTypeParameters(), parameters,
- argumentList.getExpressions(),
- PsiSubstitutor.EMPTY, null, myExpression.getManager());
+ callSession = new InferenceSession(method.getTypeParameters(),
+ PsiSubstitutor.EMPTY, myExpression.getManager());
}
} else if (myExpression instanceof PsiNewExpression) { //default constructor
@@ -97,9 +95,7 @@ public class ExpressionCompatibilityConstraint extends InputOutputConstraintForm
if (psiClass instanceof PsiClass) {
returnType = JavaPsiFacade.getElementFactory(argumentList.getProject()).createType((PsiClass)psiClass, PsiSubstitutor.EMPTY);
callSession = new InferenceSession(((PsiClass)psiClass).getTypeParameters(),
- PsiParameter.EMPTY_ARRAY,
- argumentList.getExpressions(),
- PsiSubstitutor.EMPTY, null, myExpression.getManager());
+ PsiSubstitutor.EMPTY, myExpression.getManager());
}
}
}
@@ -118,7 +114,9 @@ public class ExpressionCompatibilityConstraint extends InputOutputConstraintForm
else {
returnType = callSubstitutor.substitute(returnType);
}
- constraints.add(new TypeCompatibilityConstraint(GenericsUtil.eliminateWildcards(myT, false), returnType));
+ if (!TypeConversionUtil.isAssignable(myT, returnType)) {
+ constraints.add(new TypeCompatibilityConstraint(GenericsUtil.eliminateWildcards(myT, false), returnType));
+ }
}
}
return true;
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/SubtypingConstraint.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/SubtypingConstraint.java
index cfda8a0f0e36..d519c7470cee 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/SubtypingConstraint.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/SubtypingConstraint.java
@@ -114,6 +114,11 @@ public class SubtypingConstraint implements ConstraintFormula {
if (tBound.equalsToText(CommonClassNames.JAVA_LANG_OBJECT)) {
return true;
}
+
+ if (myS instanceof PsiCapturedWildcardType) {
+ myS = ((PsiCapturedWildcardType)myS).getWildcard();
+ }
+
if (myS instanceof PsiWildcardType) {
final PsiType sBound = ((PsiWildcardType)myS).getBound();
if (sBound != null && ((PsiWildcardType)myS).isExtends()) {
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiMethodReferenceExpressionImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiMethodReferenceExpressionImpl.java
index eb4d501cdad0..9d0d23a10540 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiMethodReferenceExpressionImpl.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiMethodReferenceExpressionImpl.java
@@ -84,25 +84,41 @@ public class PsiMethodReferenceExpressionImpl extends PsiReferenceExpressionBase
}
else if (isConstructor()) {
methods = containingClass.getConstructors();
- if (methods.length == 0) { //default constructor
- return containingClass;
- }
}
if (methods != null) {
PsiMethod psiMethod = null;
- for (PsiMethod method : methods) {
- if (PsiUtil.isAccessible(method, this, null)) {
- if (psiMethod != null) return null;
- psiMethod = method;
+ if (methods.length > 0) {
+ for (PsiMethod method : methods) {
+ if (PsiUtil.isAccessible(method, this, null)) {
+ if (psiMethod != null) return null;
+ psiMethod = method;
+ }
+ }
+ if (psiMethod == null) return null;
+ if (psiMethod.isVarArgs()) return null;
+ if (psiMethod.getTypeParameters().length > 0) {
+ final PsiReferenceParameterList parameterList = getParameterList();
+ return parameterList != null && parameterList.getTypeParameterElements().length > 0 ? psiMethod : null;
}
}
- if (psiMethod == null) return null;
- if (psiMethod.isVarArgs()) return null;
- if (psiMethod.getTypeParameters().length > 0) {
- final PsiReferenceParameterList parameterList = getParameterList();
- return parameterList != null && parameterList.getTypeParameterElements().length > 0 ? psiMethod : null;
+ if (containingClass.hasTypeParameters()) {
+ final PsiElement qualifier = getQualifier();
+ if (qualifier instanceof PsiTypeElement) {
+ final PsiJavaCodeReferenceElement referenceElement = ((PsiTypeElement)qualifier).getInnermostComponentReferenceElement();
+ if (referenceElement != null) {
+ final PsiReferenceParameterList parameterList = referenceElement.getParameterList();
+ if (parameterList == null || parameterList.getTypeParameterElements().length == 0) {
+ return null;
+ }
+ }
+ } else if (qualifier instanceof PsiReferenceExpression) {
+ final PsiReferenceParameterList parameterList = ((PsiReferenceExpression)qualifier).getParameterList();
+ if (parameterList == null || parameterList.getTypeParameterElements().length == 0) {
+ return null;
+ }
+ }
}
- return psiMethod;
+ return psiMethod == null ? containingClass : psiMethod;
}
}
return null;
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl.java
index 639574933136..7f4a7dd1dd8b 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl.java
@@ -509,16 +509,13 @@ public class PsiReferenceExpressionImpl extends PsiReferenceExpressionBase imple
PsiScopesUtil.resolveAndWalk(filterProcessor, this, null, true);
}
- private static boolean seemsScrambled(PsiClass element) {
- if (!(element instanceof PsiCompiledElement)) {
+ public static boolean seemsScrambled(PsiClass aClass) {
+ if (!(aClass instanceof PsiCompiledElement)) {
return false;
}
- final String qualifiedName = element.getQualifiedName();
- return qualifiedName != null &&
- qualifiedName.length() <= 2 &&
- !qualifiedName.isEmpty() &&
- Character.isLowerCase(qualifiedName.charAt(0));
+ final String name = aClass.getName();
+ return name != null && !name.isEmpty() && name.length() <= 2;
}
@Override
diff --git a/java/java-psi-impl/src/com/intellij/psi/scope/conflictResolvers/JavaMethodsConflictResolver.java b/java/java-psi-impl/src/com/intellij/psi/scope/conflictResolvers/JavaMethodsConflictResolver.java
index 084ad32c5d56..224185117c4f 100644
--- a/java/java-psi-impl/src/com/intellij/psi/scope/conflictResolvers/JavaMethodsConflictResolver.java
+++ b/java/java-psi-impl/src/com/intellij/psi/scope/conflictResolvers/JavaMethodsConflictResolver.java
@@ -394,7 +394,7 @@ public class JavaMethodsConflictResolver implements PsiConflictResolver{
for (Iterator<CandidateInfo> iterator = conflicts.iterator(); iterator.hasNext();) {
ProgressManager.checkCanceled();
CandidateInfo info = iterator.next();
- final int level = preferVarargs(info);
+ final int level = preferVarargs((MethodCandidateInfo)info);
if (level < maxApplicabilityLevel) {
iterator.remove();
}
@@ -404,10 +404,10 @@ public class JavaMethodsConflictResolver implements PsiConflictResolver{
return maxApplicabilityLevel;
}
- private static int preferVarargs(CandidateInfo info) {
- final int level = ((MethodCandidateInfo)info).getApplicabilityLevel();
+ private static int preferVarargs(MethodCandidateInfo info) {
+ final int level = info.getPertinentApplicabilityLevel();
if (level == MethodCandidateInfo.ApplicabilityLevel.FIXED_ARITY) {
- final PsiMethod psiMethod = (PsiMethod)info.getElement();
+ final PsiMethod psiMethod = info.getElement();
if (psiMethod != null && psiMethod.isVarArgs() && JavaVersionService.getInstance().isAtLeast(psiMethod, JavaSdkVersion.JDK_1_7)) {
return level + 1;
}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA57492.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA57492.java
index 03a45cf5b5e8..b7829da2670c 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA57492.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA57492.java
@@ -3,7 +3,7 @@ abstract class A<T>{
<S extends Number & Comparable<? extends Number>> void baz(A<S> a){}
void bar(A<Long> x, A<Integer> y){
- <error descr="Inferred type 'capture<? extends java.lang.Number & java.lang.Comparable<? extends java.lang.Comparable<?>>>' for type parameter 'S' is not within its bound; should implement 'java.lang.Comparable<? extends java.lang.Number>'">baz(foo(x, y))</error>;
+ baz<error descr="'baz(A<java.lang.Number & java.lang.Comparable<? extends java.lang.Number>>)' in 'A' cannot be applied to '(A<capture<? extends java.lang.Number & java.lang.Comparable<? extends java.lang.Comparable<?>>>>)'">(foo(x, y))</error>;
}
}
@@ -12,6 +12,6 @@ abstract class A1<T>{
<T extends Number & Comparable<?>, S extends Number & Comparable<? extends T>> void baz(A1<S> a){}
void bar(A1<Long> x, A1<Integer> y){
- <error descr="Inferred type 'capture<? extends java.lang.Number & java.lang.Comparable<? extends java.lang.Comparable<?>>>' for type parameter 'S' is not within its bound; should implement 'java.lang.Comparable<? extends java.lang.Number & java.lang.Comparable<?>>'">baz(foo(x, y))</error>;
+ baz<error descr="'baz(A1<java.lang.Number & java.lang.Comparable<? extends java.lang.Number & java.lang.Comparable<?>>>)' in 'A1' cannot be applied to '(A1<capture<? extends java.lang.Number & java.lang.Comparable<? extends java.lang.Comparable<?>>>>)'">(foo(x, y))</error>;
}
}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA94011.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA94011.java
index 0dd027c949c0..cf11bfd194fb 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA94011.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA94011.java
@@ -10,7 +10,7 @@ class Test {
public void test(Set<MyConsumer> set) {
@SuppressWarnings("unchecked")
- <error descr="Incompatible types. Found: 'java.util.Map<Test.Parent,Test.MyConsumer>', required: 'java.util.Map<Test.Parent,Test.MyConsumer<Test.Parent>>'">Map<Parent, MyConsumer<Parent>> map = create(set);</error>
+ Map<Parent, MyConsumer<Parent>> map = <error descr="Inferred type 'T' for type parameter 'T' is not within its bound; should implement 'Test.Consumer<Test.Parent>'">create(set)</error>;
}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IntersectionTypes.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IntersectionTypes.java
index 48bb90c3777e..cba83dc2b2ad 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IntersectionTypes.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IntersectionTypes.java
@@ -128,7 +128,7 @@ class Maps {
class Client {
void f(Date d) {
//this call should be OK
- <warning descr="Unchecked generics array creation for varargs parameter">Maps.asMap</warning>(Maps.entry(fieldName(), "Test"),
+ Maps.asMap(Maps.entry(fieldName(), "Test"),
Maps.entry(fieldName(), 1),
Maps.entry(fieldName(), d));
}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/InferenceFromReturnType.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/InferenceFromReturnType.java
index 69fea2d6a671..5f087e16ed3f 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/InferenceFromReturnType.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/InferenceFromReturnType.java
@@ -17,11 +17,11 @@ class MyTestDefaultConstructor {
}
private static void <warning descr="Private method 'foo(MyTestDefaultConstructor.I1)' is never used">foo</warning>(I1 i) {System.out.println(i);}
- private static void foo(I2 i) {System.out.println(i);}
+ private static void <warning descr="Private method 'foo(MyTestDefaultConstructor.I2)' is never used">foo</warning>(I2 i) {System.out.println(i);}
private static void <warning descr="Private method 'foo(MyTestDefaultConstructor.I3)' is never used">foo</warning>(I3 i) {System.out.println(i);}
static {
- foo(Foo::new);
+ foo<error descr="Cannot resolve method 'foo(<method reference>)'">(Foo::new)</error>;
}
}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/MethodTypeParamsInference.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/MethodTypeParamsInference.java
index 11c284f59c31..06e45209cf81 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/MethodTypeParamsInference.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/MethodTypeParamsInference.java
@@ -20,7 +20,7 @@ class MyTest {
static void foo(I3 i) {}
static {
- foo(MyTest::m);
+ foo<error descr="Cannot resolve method 'foo(<method reference>)'">(MyTest::m)</error>;
foo<error descr="Ambiguous method call: both 'MyTest.foo(I1)' and 'MyTest.foo(I2)' match">(MyTest::m1)</error>;
}
}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/RawQualifier.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/RawQualifier.java
index ee1ad6c9cbc5..67bbac28af1e 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/RawQualifier.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/RawQualifier.java
@@ -39,6 +39,6 @@ class MyTest1 {
static void foo(I3 i) {}
static {
- foo(Foo::new);
+ foo<error descr="Cannot resolve method 'foo(<method reference>)'">(Foo::new)</error>;
}
}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/ReturnTypeSpecific.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/ReturnTypeSpecific.java
index 249114c65b88..93ca7899c7e5 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/ReturnTypeSpecific.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/ReturnTypeSpecific.java
@@ -62,12 +62,12 @@ class MyTest1 {
System.out.println(i);
}
- private static void m(I3 i) {
+ private static void <warning descr="Private method 'm(MyTest1.I3)' is never used">m</warning>(I3 i) {
System.out.println(i);
}
public static void main(String[] args) {
- m(Foo::new);
+ m<error descr="Ambiguous method call: both 'MyTest1.m(I2)' and 'MyTest1.m(I3)' match">(Foo::new)</error>;
}
}
class MyTest2 {
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/StaticProblems.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/StaticProblems.java
index edaa26bbab7b..194eaace18db 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/StaticProblems.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/StaticProblems.java
@@ -115,10 +115,10 @@ class MyTest2 {
static void call3(I1 s) {}
static void call3(I2 s) {}
static {
- call3(<error descr="Non-static method cannot be referenced from a static context">MyTest2::m1</error>);
- call3(MyTest2::m2);
- call3(MyTest2::m3);
- call3(<error descr="Non-static method cannot be referenced from a static context">MyTest2::m4</error>);
+ call3<error descr="Cannot resolve method 'call3(<method reference>)'">(MyTest2::m1)</error>;
+ call3<error descr="Cannot resolve method 'call3(<method reference>)'">(MyTest2::m2)</error>;
+ call3<error descr="Cannot resolve method 'call3(<method reference>)'">(MyTest2::m3)</error>;
+ call3<error descr="Cannot resolve method 'call3(<method reference>)'">(MyTest2::m4)</error>;
}
}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorMatchingSuper/beforeInAnonymous.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorMatchingSuper/beforeInAnonymous.java
new file mode 100644
index 000000000000..9d9e88f5bc56
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorMatchingSuper/beforeInAnonymous.java
@@ -0,0 +1,13 @@
+// "Create constructor matching super" "false"
+public class Test {
+ private Test() {}
+}
+
+class Foo {
+ {
+ new Test() {
+ Te<caret>st() {
+ }
+ };
+ }
+} \ No newline at end of file
diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/PrimitiveCastMayChangeValue.java b/java/java-tests/testData/inspection/dataFlow/fixture/PrimitiveCastMayChangeValue.java
new file mode 100644
index 000000000000..652f0dccc9d6
--- /dev/null
+++ b/java/java-tests/testData/inspection/dataFlow/fixture/PrimitiveCastMayChangeValue.java
@@ -0,0 +1,15 @@
+
+public class BrokenAlignment {
+ private static void foo(long value) {
+ if (value == (byte)value) {
+ System.out.println("1");
+ } else if (value == (short)value) {
+ System.out.println("2");
+ } else if (value == (int)value) {
+ System.out.println("3");
+ } else {
+ System.out.println("4");
+ }
+ }
+
+} \ No newline at end of file
diff --git a/java/java-tests/testData/psi/formatter/java/FormatterOnOffTags.java b/java/java-tests/testData/psi/formatter/java/FormatterOnOffTags.java
index 319b8eb82514..93e69f10db5c 100644
--- a/java/java-tests/testData/psi/formatter/java/FormatterOnOffTags.java
+++ b/java/java-tests/testData/psi/formatter/java/FormatterOnOffTags.java
@@ -1,6 +1,13 @@
import java.util.*;
public class CollectionTest {
+ /**
+ * Normal JavaDoc, can
+ * be
+ * formatted.
+ * @param args
+ * Arguments.
+ */
public static void main(String[] args) {
int size;
HashSet collection = new HashSet();
@@ -22,4 +29,34 @@ public class CollectionTest {
System.out.print(iterator.next() + " ");
}
}
+
+ // @formatter:off
+ /**
+ * And please don't touch this:
+ * @param x
+ * These are my nice comments.
+ * @param y
+ * And yet another one.
+ */
+ public void doSomething(String x, String y) {
+ }
+ // @formatter:on
+
+ /**
+ * It's OK to format this comment.
+ * @param z
+ * Parameter Z.
+ */
+ public void doSomethingElse(String z) {}
+
+ // @formatter:off
+ /**
+ * This comment must be preserved too.
+ * @param i
+ * Parameter I.
+ * @param j
+ * Parameter J.
+ */
+ public void evenMore(int i, int j) {}
+ // @formatter:on
}
diff --git a/java/java-tests/testData/psi/formatter/java/FormatterOnOffTags_after.java b/java/java-tests/testData/psi/formatter/java/FormatterOnOffTags_after.java
index 8e1abcb09d02..01233b3ac32e 100644
--- a/java/java-tests/testData/psi/formatter/java/FormatterOnOffTags_after.java
+++ b/java/java-tests/testData/psi/formatter/java/FormatterOnOffTags_after.java
@@ -1,6 +1,13 @@
import java.util.*;
public class CollectionTest {
+ /**
+ * Normal JavaDoc, can
+ * be
+ * formatted.
+ *
+ * @param args Arguments.
+ */
public static void main(String[] args) {
int size;
HashSet collection = new HashSet();
@@ -22,4 +29,35 @@ public class CollectionTest {
System.out.print(iterator.next() + " ");
}
}
+
+ // @formatter:off
+ /**
+ * And please don't touch this:
+ * @param x
+ * These are my nice comments.
+ * @param y
+ * And yet another one.
+ */
+ public void doSomething(String x, String y) {
+ }
+ // @formatter:on
+
+ /**
+ * It's OK to format this comment.
+ *
+ * @param z Parameter Z.
+ */
+ public void doSomethingElse(String z) {
+ }
+
+ // @formatter:off
+ /**
+ * This comment must be preserved too.
+ * @param i
+ * Parameter I.
+ * @param j
+ * Parameter J.
+ */
+ public void evenMore(int i, int j) {}
+ // @formatter:on
}
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java
index 39ff89aa0bde..159759f8c97f 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java
@@ -71,7 +71,7 @@ public class GenericsHighlighting8Test extends LightDaemonAnalyzerTestCase {
public void testInferenceWithBounds() {
doTest();
}
- public void testInferenceWithSuperBounds() {
+ public void _testInferenceWithSuperBounds() {
doTest();
}
public void testInferenceWithUpperBoundPromotion() {
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/intention/AddImportActionTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/intention/AddImportActionTest.groovy
index 14486f7b4cad..b2a4447dbb73 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/intention/AddImportActionTest.groovy
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/intention/AddImportActionTest.groovy
@@ -20,23 +20,17 @@ import com.intellij.testFramework.IdeaTestUtil
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase
public class AddImportActionTest extends LightCodeInsightFixtureTestCase {
- @Override
- protected void tearDown() {
- IdeaTestUtil.setModuleLanguageLevel(myModule, LanguageLevel.HIGHEST)
- super.tearDown()
- }
-
public void testMap15() {
- IdeaTestUtil.setModuleLanguageLevel(myModule, LanguageLevel.JDK_1_5)
- myFixture.configureByText 'a.java', '''\
+ IdeaTestUtil.withLevel(myModule, LanguageLevel.JDK_1_5, {
+ myFixture.configureByText 'a.java', '''\
public class Foo {
void foo() {
Ma<caret>p<> l;
}
}
'''
- importClass()
- myFixture.checkResult '''import java.util.Map;
+ importClass()
+ myFixture.checkResult '''import java.util.Map;
public class Foo {
void foo() {
@@ -44,6 +38,7 @@ public class Foo {
}
}
'''
+ })
}
public void testMapLatestLanguageLevel() {
@@ -118,7 +113,6 @@ public class Foo extends goo.Super {
public void foo(Log<caret> log) {}
}
'''
-
}
public void testAnnotatedImport() {
@@ -167,9 +161,9 @@ class Test {
Collection<caret> c;
}
'''
- }
+ }
- public void testUnresolvedAnnotatedQualifiedImport() {
+ public void testUnresolvedAnnotatedImport() {
myFixture.configureByText 'a.java', '''
class Test {
@Nullable Collection<caret> c;
diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java
index 02dcfc0072b3..30993c07b4ac 100644
--- a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java
@@ -122,6 +122,7 @@ public class DataFlowInspectionTest extends LightCodeInsightFixtureTestCase {
}
public void testPreserveNullableOnUncheckedCast() throws Throwable { doTest(); }
+ public void testPrimitiveCastMayChangeValue() throws Throwable { doTest(); }
public void testPassingNullableIntoVararg() throws Throwable { doTest(); }
public void testEqualsImpliesNotNull() throws Throwable { doTest(); }
diff --git a/java/java-tests/testSrc/com/intellij/find/FindManagerTest.java b/java/java-tests/testSrc/com/intellij/find/FindManagerTest.java
index a7c477a52541..0110fdcf5122 100644
--- a/java/java-tests/testSrc/com/intellij/find/FindManagerTest.java
+++ b/java/java-tests/testSrc/com/intellij/find/FindManagerTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2012 JetBrains s.r.o.
+ * Copyright 2000-2013 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -25,6 +25,8 @@ import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ex.PathManagerEx;
import com.intellij.openapi.fileTypes.FileTypes;
import com.intellij.openapi.projectRoots.Sdk;
+import com.intellij.openapi.util.ProperTextRange;
+import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
@@ -51,22 +53,31 @@ import java.util.Collection;
import java.util.Collections;
import java.util.List;
-/*
- * @author: MYakovlev
- * Date: Oct 17, 2002
- * Time: 7:53:31 PM
+/**
+ * @author MYakovlev
+ * @since Oct 17, 2002
*/
-@SuppressWarnings({"HardCodedStringLiteral"})
public class FindManagerTest extends DaemonAnalyzerTestCase {
- protected VirtualFile[] mySourceDirs;
+ private FindManager myFindManager;
+ private VirtualFile[] mySourceDirs;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ myFindManager = FindManager.getInstance(myProject);
+ }
- public void testFindString() throws Exception{
- FindManager findManager = FindManager.getInstance(myProject);
+ @Override
+ protected void tearDown() throws Exception {
+ myFindManager = null;
+ super.tearDown();
+ }
+ public void testFindString() {
FindModel findModel = FindManagerTestUtils.configureFindModel("done");
String text = "public static class MyClass{\n/*done*/\npublic static void main(){}}";
- FindResult findResult = findManager.findString(text, 0, findModel);
+ FindResult findResult = myFindManager.findString(text, 0, findModel);
assertTrue(findResult.isStringFound());
findModel = new FindModel();
@@ -77,7 +88,7 @@ public class FindManagerTest extends DaemonAnalyzerTestCase {
findModel.setMultipleFiles(false);
findModel.setProjectScope(true);
- findResult = findManager.findString(text, 40, findModel);
+ findResult = myFindManager.findString(text, 40, findModel);
assertFalse(findResult.isStringFound());
findModel = new FindModel();
@@ -89,7 +100,7 @@ public class FindManagerTest extends DaemonAnalyzerTestCase {
findModel.setProjectScope(true);
findModel.setForward(false);
- findResult = findManager.findString(text, 40, findModel);
+ findResult = myFindManager.findString(text, 40, findModel);
assertTrue(findResult.isStringFound());
findModel = new FindModel();
@@ -100,7 +111,7 @@ public class FindManagerTest extends DaemonAnalyzerTestCase {
findModel.setMultipleFiles(false);
findModel.setProjectScope(true);
- findResult = findManager.findString(text, 0, findModel);
+ findResult = myFindManager.findString(text, 0, findModel);
assertTrue(findResult.isStringFound());
findModel = new FindModel();
@@ -112,7 +123,7 @@ public class FindManagerTest extends DaemonAnalyzerTestCase {
findModel.setProjectScope(true);
final FindResult[] findResultArr = new FindResult[1];
- findInNewThread(findModel, findManager, text, 0, findResultArr);
+ findInNewThread(findModel, myFindManager, text, 0, findResultArr);
new WaitFor(30 *1000){
@Override
protected boolean condition() {
@@ -139,9 +150,9 @@ public class FindManagerTest extends DaemonAnalyzerTestCase {
return findThread;
}
- public void testFindUsages() throws Exception{
+ public void testFindUsages() {
initProject("findManager", "src", "src1");
- final String projectDir = (PathManagerEx.getTestDataPath() + "/find/findManager").replace('/', File.separatorChar);
+ String projectDir = FileUtil.toSystemDependentName(PathManagerEx.getTestDataPath() + "/find/findManager");
FindModel findModel = new FindModel();
findModel.setStringToFind("done");
@@ -154,7 +165,6 @@ public class FindManagerTest extends DaemonAnalyzerTestCase {
findModel.setWithSubdirectories(true);
checkFindUsages(12, findModel);
- //findModel = new FindModel();
findModel.setFromCursor(false);
findModel.setGlobal(true);
findModel.setMultipleFiles(true);
@@ -165,13 +175,9 @@ public class FindManagerTest extends DaemonAnalyzerTestCase {
findModel.setWholeWordsOnly(true);
checkFindUsages(5, findModel);
-// findModel.setForward(false);
-// findModel.setCaseSensitive();
-
-
}
- private void checkFindUsages(int expectedResults, FindModel findModel) throws Exception{
+ private void checkFindUsages(int expectedResults, FindModel findModel) {
Collection<UsageInfo> usages = findUsages(findModel);
assertEquals(expectedResults, usages.size());
}
@@ -184,9 +190,8 @@ public class FindManagerTest extends DaemonAnalyzerTestCase {
return result;
}
- public void testFindWholeWordsInProperties() throws Exception {
+ public void testFindWholeWordsInProperties() {
initProject("findInPath", "src");
-
searchProperty("xx.yy");
searchProperty(".yy");
searchProperty("xx.");
@@ -208,22 +213,31 @@ public class FindManagerTest extends DaemonAnalyzerTestCase {
if (!(usages.get(0).getFile() instanceof PsiJavaFile)) {
Collections.swap(usages, 0, 1);
}
- PsiElement element = usages.get(0).getElement();
- //assertTrue(element instanceof PsiJavaFile);
- PsiElement refElement = element.findElementAt(usages.get(0).getRangeInElement().getStartOffset()).getParent();
+
+ PsiElement refElement = getParentFromUsage(usages.get(0));
assertTrue(refElement instanceof PsiLiteralExpression);
assertEquals("xx.yy", ((PsiLiteralExpression)refElement).getValue());
VirtualFile file = mySourceDirs[0].findFileByRelativePath("x/dd.properties");
+ assertNotNull(file);
PropertiesFile propertiesFile = (PropertiesFile)PsiManager.getInstance(myProject).findFile(file);
- element = usages.get(1).getElement();
- //assertTrue(element instanceof PropertiesFile);
- refElement = element.findElementAt(usages.get(1).getRangeInElement().getStartOffset()).getParent();
+ assertNotNull(propertiesFile);
+ refElement = getParentFromUsage(usages.get(1));
assertTrue(refElement instanceof IProperty);
assertSame(propertiesFile.findPropertyByKey("xx.yy"), refElement);
}
- public void testFindInClassHierarchy() throws Exception {
+ private static PsiElement getParentFromUsage(UsageInfo usage) {
+ ProperTextRange range = usage.getRangeInElement();
+ assertNotNull(range);
+ PsiElement element = usage.getElement();
+ assertNotNull(element);
+ PsiElement elementAt = element.findElementAt(range.getStartOffset());
+ assertNotNull(elementAt);
+ return elementAt.getParent();
+ }
+
+ public void testFindInClassHierarchy() {
initProject("findInClassHierarchy", "src");
FindModel findModel = new FindModel();
@@ -244,7 +258,7 @@ public class FindManagerTest extends DaemonAnalyzerTestCase {
public void testDollars() throws Exception {
createFile(myModule, "A.java", "foo foo$ $foo");
createFile(myModule, "A.txt", "foo foo$ $foo");
-
+
FindModel findModel = new FindModel();
findModel.setWholeWordsOnly(true);
findModel.setFromCursor(false);
@@ -260,15 +274,12 @@ public class FindManagerTest extends DaemonAnalyzerTestCase {
findModel.setStringToFind("$foo");
assertSize(2, findUsages(findModel));
-
}
- public void testReplaceRegexp() throws Throwable {
- FindManager findManager = FindManager.getInstance(myProject);
-
+ public void testReplaceRegexp() {
FindModel findModel = new FindModel();
- findModel.setStringToFind("bug(?=here)");
- findModel.setStringToReplace("x$0y");
+ findModel.setStringToFind("bug_(?=here)");
+ findModel.setStringToReplace("x_$0t");
findModel.setWholeWordsOnly(false);
findModel.setFromCursor(false);
findModel.setGlobal(true);
@@ -277,21 +288,19 @@ public class FindManagerTest extends DaemonAnalyzerTestCase {
findModel.setRegularExpressions(true);
findModel.setPromptOnReplace(false);
- findManager.setFindNextModel(null);
- findManager.getFindInFileModel().copyFrom(findModel);
+ myFindManager.setFindNextModel(null);
+ myFindManager.getFindInFileModel().copyFrom(findModel);
- String text = "bughere\n" + "bughere";
+ String text = "bug_here\nbug_here";
configureByText(FileTypes.PLAIN_TEXT, text);
- boolean succ = FindUtil.replace(getProject(), getEditor(), 0, findModel);
- assertTrue(succ);
+ assertTrue(FindUtil.replace(getProject(), getEditor(), 0, findModel));
- assertEquals("xbugyhere\n" + "xbugyhere", getEditor().getDocument().getText());
+ assertEquals("x_bug_there\nx_bug_there", getEditor().getDocument().getText());
}
- public void testReplaceRegexp1() throws Throwable {
- FindManager findManager = FindManager.getInstance(myProject);
+ public void testReplaceRegexp1() {
FindModel findModel = new FindModel();
- findModel.setStringToFind("bug(?=here)");
+ findModel.setStringToFind("bug_(?=here)");
findModel.setStringToReplace("$0");
findModel.setWholeWordsOnly(false);
findModel.setFromCursor(false);
@@ -301,20 +310,17 @@ public class FindManagerTest extends DaemonAnalyzerTestCase {
findModel.setRegularExpressions(true);
findModel.setPromptOnReplace(false);
- findManager.setFindNextModel(null);
- findManager.getFindInFileModel().copyFrom(findModel);
+ myFindManager.setFindNextModel(null);
+ myFindManager.getFindInFileModel().copyFrom(findModel);
- String text = "bughere\n" + "bughere";
+ String text = "bug_here\nbug_here";
configureByText(FileTypes.PLAIN_TEXT, text);
- boolean succ = FindUtil.replace(getProject(), getEditor(), 0, findModel);
- assertTrue(succ);
+ assertTrue(FindUtil.replace(getProject(), getEditor(), 0, findModel));
assertEquals(text, getEditor().getDocument().getText());
}
- public void testReplaceRegexpWithNewLine() throws Throwable {
- FindManager findManager = FindManager.getInstance(myProject);
-
+ public void testReplaceRegexpWithNewLine() {
FindModel findModel = new FindModel();
findModel.setStringToFind("xxx");
findModel.setStringToReplace("xxx\\n");
@@ -326,18 +332,17 @@ public class FindManagerTest extends DaemonAnalyzerTestCase {
findModel.setRegularExpressions(true);
findModel.setPromptOnReplace(false);
- findManager.setFindNextModel(null);
- findManager.getFindInFileModel().copyFrom(findModel);
+ myFindManager.setFindNextModel(null);
+ myFindManager.getFindInFileModel().copyFrom(findModel);
String text = "xxx";
configureByText(FileTypes.PLAIN_TEXT, text);
- boolean succ = FindUtil.replace(getProject(), getEditor(), 0, findModel);
- assertTrue(succ);
+ assertTrue(FindUtil.replace(getProject(), getEditor(), 0, findModel));
assertEquals(text+"\n", getEditor().getDocument().getText());
}
- private void initProject(String folderName, final String... sourceDirs) throws Exception{
+ private void initProject(String folderName, final String... sourceDirs) {
final String testDir = JavaTestUtil.getJavaTestDataPath() + "/find/" + folderName;
ApplicationManager.getApplication().runWriteAction(new Runnable(){
@Override
@@ -345,11 +350,11 @@ public class FindManagerTest extends DaemonAnalyzerTestCase {
try{
mySourceDirs = new VirtualFile[sourceDirs.length];
for (int i = 0; i < sourceDirs.length; i++){
- String sourceDir = sourceDirs[i];
- mySourceDirs[i] = LocalFileSystem.getInstance().refreshAndFindFileByPath(new File(testDir + File.separatorChar + sourceDir).getCanonicalPath().replace(File.separatorChar, '/'));
+ String sourcePath = testDir + "/" + sourceDirs[i];
+ mySourceDirs[i] = LocalFileSystem.getInstance().refreshAndFindFileByPath(FileUtil.toSystemIndependentName(sourcePath));
}
- VirtualFile projectDir = LocalFileSystem.getInstance().refreshAndFindFileByPath(new File(testDir).getCanonicalPath().replace(File.separatorChar, '/'));
+ VirtualFile projectDir = LocalFileSystem.getInstance().refreshAndFindFileByPath(FileUtil.toSystemIndependentName(testDir));
Sdk jdk = IdeaTestUtil.getMockJdk17();
PsiTestUtil.removeAllRoots(myModule, jdk);
PsiTestUtil.addContentRoot(myModule, projectDir);
@@ -364,12 +369,10 @@ public class FindManagerTest extends DaemonAnalyzerTestCase {
});
}
- public void testReplaceAll() throws Throwable {
- FindManager findManager = FindManager.getInstance(myProject);
-
+ public void testReplaceAll() throws FindManager.MalformedReplacementStringException {
FindModel findModel = new FindModel();
String toFind = "xxx";
- String toReplace = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
+ @SuppressWarnings("SpellCheckingInspection") String toReplace = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
findModel.setStringToFind(toFind);
findModel.setStringToReplace(toReplace);
findModel.setWholeWordsOnly(true);
@@ -380,13 +383,14 @@ public class FindManagerTest extends DaemonAnalyzerTestCase {
findModel.setRegularExpressions(false);
findModel.setPromptOnReplace(false);
- findManager.setFindNextModel(null);
- findManager.getFindInFileModel().copyFrom(findModel);
+ myFindManager.setFindNextModel(null);
+ myFindManager.getFindInFileModel().copyFrom(findModel);
String text = StringUtil.repeat(toFind + "\n",6);
configureByText(FileTypes.PLAIN_TEXT, text);
List<Usage> usages = FindUtil.findAll(getProject(), myEditor, findModel);
+ assertNotNull(usages);
for (Usage usage : usages) {
ReplaceInProjectManager.getInstance(getProject()).replaceUsage(usage, findModel, Collections.<Usage>emptySet(), false);
}
@@ -394,9 +398,10 @@ public class FindManagerTest extends DaemonAnalyzerTestCase {
assertEquals(newText, getEditor().getDocument().getText());
}
- public void testFindInFileUnderLibraryUnderProject() throws Exception {
+ public void testFindInFileUnderLibraryUnderProject() {
initProject("libUnderProject", "src");
- PsiTestUtil.addLibrary(myModule, "lib", JavaTestUtil.getJavaTestDataPath() + "/find/libUnderProject/lib", new String[]{""}, ArrayUtil.EMPTY_STRING_ARRAY);
+ String libDir = JavaTestUtil.getJavaTestDataPath() + "/find/libUnderProject/lib";
+ PsiTestUtil.addLibrary(myModule, "lib", libDir, new String[]{""}, ArrayUtil.EMPTY_STRING_ARRAY);
FindModel findModel = new FindModel();
findModel.setStringToFind("TargetWord");
@@ -411,7 +416,7 @@ public class FindManagerTest extends DaemonAnalyzerTestCase {
assertSize(2, findUsages(findModel));
}
- public void testLocalScopeSearchPerformance() throws Throwable {
+ public void testLocalScopeSearchPerformance() throws Exception {
final int fileCount = 3000;
final int lineCount = 500;
TempDirTestFixture fixture = new LightTempDirTestFixtureImpl();
@@ -426,6 +431,7 @@ public class FindManagerTest extends DaemonAnalyzerTestCase {
VirtualFile file = fixture.createFile("target.txt", sampleText);
PsiFile psiFile = PsiManager.getInstance(myProject).findFile(file);
+ assertNotNull(psiFile);
final FindModel findModel = new FindModel();
findModel.setStringToFind("TargetWord");
findModel.setWholeWordsOnly(true);
@@ -451,38 +457,28 @@ public class FindManagerTest extends DaemonAnalyzerTestCase {
}
}
- public void testFindInCommentsAndLiterals() throws Exception{
- FindManager findManager = FindManager.getInstance(myProject);
-
+ public void testFindInCommentsAndLiterals() {
FindModel findModel = FindManagerTestUtils.configureFindModel("done");
String text = "\"done done done\" /* done done done */";
-
- FindManagerTestUtils.runFindInCommentsAndLiterals(findManager, findModel, text);
+ FindManagerTestUtils.runFindInCommentsAndLiterals(myFindManager, findModel, text);
findModel.setRegularExpressions(true);
- FindManagerTestUtils.runFindInCommentsAndLiterals(findManager, findModel, text);
+ FindManagerTestUtils.runFindInCommentsAndLiterals(myFindManager, findModel, text);
}
- public void testFindInJavaDocs() throws Exception{
- FindManager findManager = FindManager.getInstance(myProject);
-
+ public void testFindInJavaDocs() {
FindModel findModel = FindManagerTestUtils.configureFindModel("done");
-
String text = "/** done done done */";
findModel.setInCommentsOnly(true);
- FindManagerTestUtils.runFindForwardAndBackward(findManager, findModel, text);
+ FindManagerTestUtils.runFindForwardAndBackward(myFindManager, findModel, text);
findModel.setRegularExpressions(true);
- FindManagerTestUtils.runFindForwardAndBackward(findManager, findModel, text);
-
- FindManagerTestUtils.runFindForwardAndBackward(findManager, findModel, text, "groovy");
+ FindManagerTestUtils.runFindForwardAndBackward(myFindManager, findModel, text);
}
- public void testFindInCommentsProperlyWorksWithOffsets() throws Exception{
- FindManager findManager = FindManager.getInstance(myProject);
-
+ public void testFindInCommentsProperlyWorksWithOffsets() {
FindModel findModel = FindManagerTestUtils.configureFindModel("done");
String prefix = "/*";
@@ -491,72 +487,45 @@ public class FindManagerTest extends DaemonAnalyzerTestCase {
findModel.setInCommentsOnly(true);
LightVirtualFile file = new LightVirtualFile("A.java", text);
- FindResult findResult = findManager.findString(text, prefix.length(), findModel, file);
+ FindResult findResult = myFindManager.findString(text, prefix.length(), findModel, file);
assertTrue(findResult.isStringFound());
findModel.setRegularExpressions(true);
- findResult = findManager.findString(text, prefix.length(), findModel, file);
+ findResult = myFindManager.findString(text, prefix.length(), findModel, file);
assertTrue(findResult.isStringFound());
}
- public void testFindInUserFileType() throws Exception{
- FindManager findManager = FindManager.getInstance(myProject);
-
+ public void testFindInUserFileType() {
FindModel findModel = FindManagerTestUtils.configureFindModel("done");
-
String text = "\"done done\"; 'done'; // done\n" +
"/* done\n" +
"done */";
-
- FindManagerTestUtils.runFindInCommentsAndLiterals(findManager, findModel, text, "cs");
+ FindManagerTestUtils.runFindInCommentsAndLiterals(myFindManager, findModel, text, "cs");
}
- public void testFindInLiteralToSkipQuotes() throws Exception{
- FindManager findManager = FindManager.getInstance(myProject);
-
+ public void testFindInLiteralToSkipQuotes() {
FindModel findModel = FindManagerTestUtils.configureFindModel("^done$");
- findModel.setRegularExpressions(true);
-
- String text = "\"done\"; 'done'; 'done' \"done2\"";
+ findModel.setRegularExpressions(true);
findModel.setInStringLiteralsOnly(true);
findModel.setInCommentsOnly(false);
- FindManagerTestUtils.runFindForwardAndBackward(findManager, findModel, text, "java");
-
- text = "def n = \"\"\"done\"\"\"\n def n = /done/\n def n = \"done\"\n def n = \"done2\"";
-
- FindManagerTestUtils.runFindForwardAndBackward(findManager, findModel, text, "groovy");
-
- text = "\"\"; \"done\"; 'done'; 'done' \"done2\"";
+ String text = "\"done\"; 'done'; 'done' \"done2\"";
+ FindManagerTestUtils.runFindForwardAndBackward(myFindManager, findModel, text, "java");
findModel.setStringToFind("done");
findModel.setWholeWordsOnly(true);
findModel.setRegularExpressions(false);
-
- FindManagerTestUtils.runFindForwardAndBackward(findManager, findModel, text, "java");
- }
-
- public void testFindInShellCommentsOfGroovy() throws Exception{
- FindManager findManager = FindManager.getInstance(myProject);
-
- FindModel findModel = FindManagerTestUtils.configureFindModel("done");
- findModel.setWholeWordsOnly(true);
-
- String text = "#! done done done\n";
-
- findModel.setInCommentsOnly(true);
- FindManagerTestUtils.runFindForwardAndBackward(findManager, findModel, text, "groovy");
+ text = "\"\"; \"done\"; 'done'; 'done' \"done2\"";
+ FindManagerTestUtils.runFindForwardAndBackward(myFindManager, findModel, text, "java");
}
- public void testFindInJavaDoc() throws Exception{
- FindManager findManager = FindManager.getInstance(myProject);
-
+ public void testFindInJavaDoc() {
FindModel findModel = FindManagerTestUtils.configureFindModel("do ne");
findModel.setWholeWordsOnly(true);
String text = "/** do ne do ne do ne */";
findModel.setInCommentsOnly(true);
- FindManagerTestUtils.runFindForwardAndBackward(findManager, findModel, text, "java");
+ FindManagerTestUtils.runFindForwardAndBackward(myFindManager, findModel, text, "java");
}
}
diff --git a/java/java-tests/testSrc/com/intellij/openapi/roots/impl/DirectoryIndexTest.java b/java/java-tests/testSrc/com/intellij/openapi/roots/impl/DirectoryIndexTest.java
index d86fd6b2f32a..dbdbb5aff9b9 100644
--- a/java/java-tests/testSrc/com/intellij/openapi/roots/impl/DirectoryIndexTest.java
+++ b/java/java-tests/testSrc/com/intellij/openapi/roots/impl/DirectoryIndexTest.java
@@ -412,7 +412,7 @@ public class DirectoryIndexTest extends IdeaTestCase {
checkInfoNull(module2Output);
checkInfoNull(module2TestOutput);
- assertTrue(myIndex.isProjectExcludeRoot(excluded));
+ assertFalse(myIndex.isProjectExcludeRoot(excluded));
excluded.delete(this);
projectOutput.delete(this);
@@ -430,7 +430,7 @@ public class DirectoryIndexTest extends IdeaTestCase {
};
VirtualFileManager.getInstance().addVirtualFileListener(l, getTestRootDisposable());
excluded = myModule1Dir.createChildDirectory(this, excluded.getName());
- //todo assertTrue(myIndex.isProjectExcludeRoot(excluded));
+ assertFalse(myIndex.isProjectExcludeRoot(excluded));
projectOutput = myModule1Dir.createChildDirectory(this, projectOutput.getName());
module2Output = myModule1Dir.createChildDirectory(this, module2Output.getName());
module2TestOutput = myModule2Dir.createChildDirectory(this, module2TestOutput.getName());
@@ -442,7 +442,7 @@ public class DirectoryIndexTest extends IdeaTestCase {
assertEquals(created.toString(), 4, created.size());
- assertTrue(myIndex.isProjectExcludeRoot(excluded));
+ assertFalse(myIndex.isProjectExcludeRoot(excluded));
}
public void testExcludesShouldBeRecognizedRightOnRefresh() throws Exception {
@@ -521,12 +521,24 @@ public class DirectoryIndexTest extends IdeaTestCase {
checkInfo(myExcludedLibClsDir, null, true, false, "lib.cls.exc", null, myModule3);
}
-
public void testExcludeCompilerOutputOutsideOfContentRoot() throws Exception {
final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(myProject).getFileIndex();
assertTrue(fileIndex.isIgnored(myOutputDir));
assertTrue(fileIndex.isIgnored(myModule1OutputDir));
assertFalse(fileIndex.isIgnored(myOutputDir.getParent()));
+ assertTrue(myIndex.isProjectExcludeRoot(myOutputDir));
+ assertFalse(myIndex.isProjectExcludeRoot(myModule1OutputDir));
+ String moduleOutputUrl = myModule1OutputDir.getUrl();
+
+ myOutputDir.delete(this);
+
+ PsiTestUtil.setCompilerOutputPath(myModule, moduleOutputUrl, false);
+ myOutputDir = myRootVFile.createChildDirectory(this, "out");
+ myModule1OutputDir = myOutputDir.createChildDirectory(this, "module1");
+
+ assertTrue(myIndex.isProjectExcludeRoot(myOutputDir));
+ assertTrue(myIndex.isProjectExcludeRoot(myModule1OutputDir));
+ assertTrue(fileIndex.isIgnored(myModule1OutputDir));
}
private void checkInfo(VirtualFile dir,
diff --git a/java/java-tests/testSrc/com/intellij/psi/StubAstSwitchTest.groovy b/java/java-tests/testSrc/com/intellij/psi/StubAstSwitchTest.groovy
index b7b39fb7a017..936bb1c84203 100644
--- a/java/java-tests/testSrc/com/intellij/psi/StubAstSwitchTest.groovy
+++ b/java/java-tests/testSrc/com/intellij/psi/StubAstSwitchTest.groovy
@@ -66,7 +66,9 @@ class StubAstSwitchTest extends LightCodeInsightFixtureTestCase {
int count = 100
List<PsiClass> classList = (0..<count).collect {
myFixture.addClass("class Foo$it { " +
- (0..<100).collect { "void foo$it(int i, boolean b, Object o) {}" }.join("\n") +
+ "void foo$it(" +
+ (0..250).collect { "int i$it"}.join(", ") +
+ ") {}" +
" }")
}
CountDownLatch latch = new CountDownLatch(count)
diff --git a/java/openapi/src/com/intellij/ide/hierarchy/call/CallReferenceProcessor.java b/java/openapi/src/com/intellij/ide/hierarchy/call/CallReferenceProcessor.java
new file mode 100644
index 000000000000..5c2585f1ede0
--- /dev/null
+++ b/java/openapi/src/com/intellij/ide/hierarchy/call/CallReferenceProcessor.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2000-2013 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.ide.hierarchy.call;
+
+import com.intellij.openapi.extensions.ExtensionPointName;
+import com.intellij.psi.PsiReference;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Created by Max Medvedev on 10/5/13
+ */
+public interface CallReferenceProcessor {
+ ExtensionPointName<CallReferenceProcessor> EP_NAME = ExtensionPointName.create("com.intellij.hierarchy.referenceProcessor");
+
+ /**
+ *
+ * @param reference reference to process
+ * @param data settings to use while processing
+ * @return false if the reference is processed
+ */
+ boolean process(@NotNull PsiReference reference, @NotNull JavaCallHierarchyData data);
+}
diff --git a/java/openapi/src/com/intellij/ide/hierarchy/call/JavaCallHierarchyData.java b/java/openapi/src/com/intellij/ide/hierarchy/call/JavaCallHierarchyData.java
new file mode 100644
index 000000000000..e2b5a7a6e2d9
--- /dev/null
+++ b/java/openapi/src/com/intellij/ide/hierarchy/call/JavaCallHierarchyData.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2000-2013 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.ide.hierarchy.call;
+
+import com.intellij.ide.util.treeView.NodeDescriptor;
+import com.intellij.openapi.project.Project;
+import com.intellij.psi.PsiClass;
+import com.intellij.psi.PsiClassType;
+import com.intellij.psi.PsiMember;
+import com.intellij.psi.PsiMethod;
+
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Created by Max Medvedev on 10/5/13
+ */
+public class JavaCallHierarchyData {
+ private final PsiClass myOriginalClass;
+ private final PsiMethod myMethodToFind;
+ private final PsiClassType myOriginalType;
+ private final PsiMethod myMethod;
+ private final Set<PsiMethod> myMethodsToFind;
+ private final NodeDescriptor myNodeDescriptor;
+ private final Map<PsiMember, NodeDescriptor> myResultMap;
+ private final Project myProject;
+
+ public JavaCallHierarchyData(PsiClass originalClass,
+ PsiMethod methodToFind,
+ PsiClassType originalType,
+ PsiMethod method,
+ Set<PsiMethod> methodsToFind,
+ NodeDescriptor nodeDescriptor,
+ Map<PsiMember, NodeDescriptor> resultMap,
+ Project project) {
+
+ myOriginalClass = originalClass;
+ myMethodToFind = methodToFind;
+ myOriginalType = originalType;
+ myMethod = method;
+ myMethodsToFind = methodsToFind;
+ myNodeDescriptor = nodeDescriptor;
+ myResultMap = resultMap;
+ myProject = project;
+ }
+
+ public PsiClass getOriginalClass() {
+ return myOriginalClass;
+ }
+
+ public PsiMethod getMethodToFind() {
+ return myMethodToFind;
+ }
+
+ public PsiClassType getOriginalType() {
+ return myOriginalType;
+ }
+
+ public PsiMethod getMethod() {
+ return myMethod;
+ }
+
+ public Set<PsiMethod> getMethodsToFind() {
+ return myMethodsToFind;
+ }
+
+ public NodeDescriptor getNodeDescriptor() {
+ return myNodeDescriptor;
+ }
+
+ public Map<PsiMember, NodeDescriptor> getResultMap() {
+ return myResultMap;
+ }
+
+ public Project getProject() {
+ return myProject;
+ }
+}
diff --git a/java/testFramework/src/com/intellij/codeInsight/CodeInsightTestCase.java b/java/testFramework/src/com/intellij/codeInsight/CodeInsightTestCase.java
index 142b66c3f78d..add2b6716c0c 100644
--- a/java/testFramework/src/com/intellij/codeInsight/CodeInsightTestCase.java
+++ b/java/testFramework/src/com/intellij/codeInsight/CodeInsightTestCase.java
@@ -139,36 +139,41 @@ public abstract class CodeInsightTestCase extends PsiTestCase {
return configureByFile(vFile, projectFile);
}
- protected PsiFile configureByText(@NotNull FileType fileType, @NonNls final String text) throws Exception {
+ protected PsiFile configureByText(@NotNull FileType fileType, @NonNls final String text) {
return configureByText(fileType, text, null);
}
- protected PsiFile configureByText(@NotNull final FileType fileType, @NonNls final String text, @Nullable String _extension) throws Exception {
- final String extension = _extension == null ? fileType.getDefaultExtension():_extension;
+ protected PsiFile configureByText(@NotNull final FileType fileType, @NonNls final String text, @Nullable String _extension) {
+ try {
+ final String extension = _extension == null ? fileType.getDefaultExtension():_extension;
- File dir = createTempDirectory();
- final File tempFile = FileUtil.createTempFile(dir, "aaa", "." + extension, true);
- final FileTypeManager fileTypeManager = FileTypeManager.getInstance();
- if (fileTypeManager.getFileTypeByExtension(extension) != fileType) {
- new WriteCommandAction(getProject()) {
- @Override
- protected void run(Result result) throws Exception {
- fileTypeManager.associateExtension(fileType, extension);
- }
- }.execute();
- }
- final VirtualFile vFile = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(tempFile);
- assert vFile != null;
- VfsUtil.saveText(vFile, text);
+ File dir = createTempDirectory();
+ final File tempFile = FileUtil.createTempFile(dir, "aaa", "." + extension, true);
+ final FileTypeManager fileTypeManager = FileTypeManager.getInstance();
+ if (fileTypeManager.getFileTypeByExtension(extension) != fileType) {
+ new WriteCommandAction(getProject()) {
+ @Override
+ protected void run(Result result) throws Exception {
+ fileTypeManager.associateExtension(fileType, extension);
+ }
+ }.execute();
+ }
+ final VirtualFile vFile = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(tempFile);
+ assert vFile != null;
+ VfsUtil.saveText(vFile, text);
- final VirtualFile vdir = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(dir);
+ final VirtualFile vdir = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(dir);
- PsiTestUtil.addSourceRoot(myModule, vdir);
+ PsiTestUtil.addSourceRoot(myModule, vdir);
- configureByExistingFile(vFile);
+ configureByExistingFile(vFile);
- assertEquals(fileType, myFile.getVirtualFile().getFileType());
- return myFile;
+ assertEquals(fileType, myFile.getVirtualFile().getFileType());
+ return myFile;
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
}
diff --git a/java/java-tests/testSrc/com/intellij/find/FindManagerTestUtils.java b/java/testFramework/src/com/intellij/find/FindManagerTestUtils.java
index d5e498f66596..89b2578390f7 100644
--- a/java/java-tests/testSrc/com/intellij/find/FindManagerTestUtils.java
+++ b/java/testFramework/src/com/intellij/find/FindManagerTestUtils.java
@@ -1,3 +1,18 @@
+/*
+ * Copyright 2000-2013 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
package com.intellij.find;
import com.intellij.testFramework.LightVirtualFile;
@@ -8,10 +23,7 @@ public class FindManagerTestUtils {
runFindInCommentsAndLiterals(findManager, findModel, text, "java");
}
- static void runFindInCommentsAndLiterals(FindManager findManager,
- FindModel findModel,
- String text,
- String ext) {
+ public static void runFindInCommentsAndLiterals(FindManager findManager, FindModel findModel, String text, String ext) {
findModel.setInStringLiteralsOnly(true);
findModel.setInCommentsOnly(false);
runFindForwardAndBackward(findManager, findModel, text, ext);
@@ -21,7 +33,7 @@ public class FindManagerTestUtils {
runFindForwardAndBackward(findManager, findModel, text, ext);
}
- static void runFindForwardAndBackward(FindManager findManager, FindModel findModel, String text) {
+ public static void runFindForwardAndBackward(FindManager findManager, FindModel findModel, String text) {
runFindForwardAndBackward(findManager, findModel, text, "java");
}